From e49929261137a80377b9421e0f92ceff540a0d82 Mon Sep 17 00:00:00 2001 From: Boy Lane Date: Sun, 27 Dec 2009 18:45:05 +0800 Subject: [PATCH 1/4] New CV 1.22.12.0 branch created --- ChangeLog.txt | 48 + README.txt | 8 +- RELEASE_NOTES.txt | 139 +- linden/doc/contributions.txt | 3 + linden/indra/CMakeLists.txt | 4 +- linden/indra/cmake/00-Common.cmake | 2 +- linden/indra/cmake/UnixInstall.cmake | 4 +- linden/indra/copy_win_scripts/start-client.py | 2 +- linden/indra/develop.py | 8 +- .../linux_crash_logger/llcrashloggerlinux.cpp | 6 +- linden/indra/llrender/llgl.cpp | 14 +- linden/indra/llvfs/lldir.cpp | 6 +- linden/indra/llvfs/lldir_linux.cpp | 4 +- linden/indra/llwindow/GL/glh_genext.h | 5473 +++++++---- linden/indra/newview/CMakeLists.txt | 22 +- .../classes.nib | 0 .../info.nib | 0 .../objects.xib | 10 +- .../newview/English.lproj/InfoPlist.strings | 6 +- ...nbowViewer.plist => Info-CoolViewer.plist} | 4 +- ...rbis.plist => Info-CoolViewerVorbis.plist} | 4 +- linden/indra/newview/RRInterface.cpp | 2581 +++++ linden/indra/newview/RRInterface.h | 202 + .../indra/newview/app_settings/settings.xml | 176 +- .../newview/installers/autoit/nrc_install.au3 | 57 + .../newview/installers/autoit/nrc_install.ico | Bin 0 -> 9662 bytes .../installers/windows/install_icon.BMP | Bin 131128 -> 262200 bytes .../installers/windows/install_icon.ico | Bin 363246 -> 363246 bytes .../installers/windows/installer_template.nsi | 78 +- .../newview/installers/windows/lang_en-us.nsi | Bin 7290 -> 7164 bytes linden/indra/newview/llagent.cpp | 98 +- linden/indra/newview/llagent.h | 8 + linden/indra/newview/llappviewer.cpp | 127 +- linden/indra/newview/llappviewerwin32.cpp | 89 +- linden/indra/newview/llchatbar.cpp | 335 +- linden/indra/newview/llchatbar.cpp.orig | 884 ++ linden/indra/newview/llchatbar.h | 14 +- linden/indra/newview/llconsole.cpp | 4 + linden/indra/newview/llfloaterabout.cpp | 51 +- linden/indra/newview/llfloateravatarlist.cpp | 31 + linden/indra/newview/llfloaterbeacons.cpp | 28 + linden/indra/newview/llfloaterbuyland.cpp | 11 +- linden/indra/newview/llfloaterchat.cpp | 29 +- linden/indra/newview/llfloaterchat.cpp.orig | 555 ++ linden/indra/newview/llfloaterchatterbox.cpp | 101 +- linden/indra/newview/llfloaterchatterbox.h | 44 +- linden/indra/newview/llfloaterfriends.cpp | 234 +- linden/indra/newview/llfloaterfriends.h | 23 +- linden/indra/newview/llfloatergodtools.cpp | 30 + linden/indra/newview/llfloatergroupinfo.cpp | 5 +- linden/indra/newview/llfloatergroups.cpp | 109 +- linden/indra/newview/llfloatergroups.h | 19 +- linden/indra/newview/llfloaterland.cpp | 10 + linden/indra/newview/llfloatermap.cpp | 15 + linden/indra/newview/llfloatermap.h | 3 + linden/indra/newview/llfloateropenobject.cpp | 11 +- linden/indra/newview/llfloaterpreference.cpp | 4 +- linden/indra/newview/llfloaterproperties.cpp | 15 + linden/indra/newview/llfloaterreporter.cpp | 33 +- .../indra/newview/llfloatersettingsdebug.cpp | 111 + linden/indra/newview/llfloatersnapshot.cpp | 31 + .../newview/llfloaterteleporthistory.cpp | 13 + linden/indra/newview/llfloaterworldmap.cpp | 25 + linden/indra/newview/llfloaterworldmap.h | 3 + linden/indra/newview/llgesturemgr.cpp | 12 +- linden/indra/newview/llglsandbox.cpp | 11 + linden/indra/newview/llhoverview.cpp | 20 + linden/indra/newview/llhudtext.cpp | 42 +- linden/indra/newview/llhudtext.h | 10 + linden/indra/newview/llhudview.cpp | 4 +- linden/indra/newview/llhudview.h | 6 +- linden/indra/newview/llimpanel.cpp | 11 + linden/indra/newview/llimview.cpp | 130 +- linden/indra/newview/llimview.cpp.orig | 1657 ++++ linden/indra/newview/llinventorybridge.cpp | 123 +- linden/indra/newview/llinventorybridge.h | 4 +- linden/indra/newview/llinventorymodel.cpp | 33 + linden/indra/newview/llinventorymodel.h | 12 +- linden/indra/newview/llinventoryview.cpp | 15 + linden/indra/newview/llinventoryview.h | 3 + linden/indra/newview/llmaniptranslate.cpp | 23 +- linden/indra/newview/llmediaremotectrl.cpp | 155 +- linden/indra/newview/llmediaremotectrl.h | 19 +- linden/indra/newview/llmoveview.cpp | 9 + linden/indra/newview/llmoveview.h | 2 + linden/indra/newview/llnetmap.cpp | 19 +- linden/indra/newview/llnotify.cpp | 23 +- linden/indra/newview/llnotify.cpp.orig | 1074 +++ linden/indra/newview/lloverlaybar.cpp | 452 +- linden/indra/newview/lloverlaybar.h | 31 +- linden/indra/newview/llpanelaudiovolume.cpp | 105 +- linden/indra/newview/llpanelaudiovolume.h | 20 +- linden/indra/newview/llpanelavatar.cpp | 18 +- linden/indra/newview/llpanelavatar.cpp.orig | 2379 +++++ linden/indra/newview/llpanelcontents.cpp | 27 +- linden/indra/newview/llpaneldirfind.cpp | 24 +- linden/indra/newview/llpaneldisplay.cpp | 19 + linden/indra/newview/llpanelinventory.cpp | 57 + linden/indra/newview/llpanelland.cpp | 16 + linden/indra/newview/llpanellogin.cpp | 7 +- linden/indra/newview/llpanelobject.cpp | 25 + linden/indra/newview/llpanelpermissions.cpp | 28 + linden/indra/newview/llpanelpick.cpp | 20 +- linden/indra/newview/llprefsim.cpp | 10 + linden/indra/newview/llpreviewscript.cpp | 30 +- linden/indra/newview/llselectmgr.cpp | 11 + linden/indra/newview/llstartup.cpp | 38 +- linden/indra/newview/llstatusbar.cpp | 64 +- linden/indra/newview/llstatusbar.cpp.orig | 915 ++ linden/indra/newview/lltexturectrl.cpp | 11 + linden/indra/newview/lltoolbar.cpp | 232 +- linden/indra/newview/lltoolbar.h | 10 +- linden/indra/newview/lltooldraganddrop.cpp | 84 +- linden/indra/newview/lltoolface.cpp | 17 + linden/indra/newview/lltoolgrab.cpp | 82 + linden/indra/newview/lltoolpie.cpp | 35 +- linden/indra/newview/lltoolplacer.cpp | 14 + linden/indra/newview/lltoolselect.cpp | 47 +- linden/indra/newview/lltracker.cpp | 11 + linden/indra/newview/llurlsimstring.cpp | 6 + linden/indra/newview/llviewerdisplay.cpp | 21 +- linden/indra/newview/llviewergesture.cpp | 11 +- .../indra/newview/llviewerjointattachment.cpp | 121 + linden/indra/newview/llviewerjointmesh.cpp | 13 +- linden/indra/newview/llviewermenu.cpp | 604 +- linden/indra/newview/llviewermenu.cpp.orig | 8327 +++++++++++++++++ linden/indra/newview/llviewermessage.cpp | 569 +- linden/indra/newview/llviewerobject.cpp | 6 + linden/indra/newview/llviewerwindow.cpp | 182 +- linden/indra/newview/llviewerwindow.cpp.orig | 5569 +++++++++++ linden/indra/newview/llviewerwindow.h | 6 +- linden/indra/newview/llvoavatar.cpp | 81 +- linden/indra/newview/llvoiceremotectrl.cpp | 12 +- linden/indra/newview/llvovolume.cpp | 12 +- linden/indra/newview/llwindebug.cpp | 8 +- linden/indra/newview/llwlparammanager.cpp | 10 + linden/indra/newview/nrc_install.exe | Bin 0 -> 276511 bytes linden/indra/newview/pipeline.cpp | 15 +- linden/indra/newview/prefsrainbow.cpp | 88 +- linden/indra/newview/res/viewerRes.rc | 10 +- .../xui/en-us/floater_audio_volume.xml | 15 +- .../xui/en-us/floater_chat_history.xml | 83 +- .../xui/en-us/floater_chat_history2.xml | 105 + .../default/xui/en-us/floater_friends.xml | 59 + .../default/xui/en-us/floater_groups.xml | 58 + .../default/xui/en-us/floater_moveview.xml | 4 +- .../skins/default/xui/en-us/menu_viewer.xml | 26 +- .../default/xui/en-us/menu_viewer.xml.orig | 826 ++ .../skins/default/xui/en-us/panel_audio2.xml | 60 + .../default/xui/en-us/panel_chat_bar.xml | 56 +- .../skins/default/xui/en-us/panel_login.xml | 2 +- .../default/xui/en-us/panel_master_volume.xml | 24 +- .../default/xui/en-us/panel_media_remote.xml | 38 +- .../default/xui/en-us/panel_music_remote.xml | 32 + .../default/xui/en-us/panel_overlaybar.xml | 88 +- .../xui/en-us/panel_preferences_rainbow.xml | 5 + .../default/xui/en-us/panel_status_bar2.xml | 123 + .../default/xui/en-us/panel_toolbar1.xml | 31 + .../default/xui/en-us/panel_toolbar2.xml | 34 + .../default/xui/en-us/panel_voice_remote.xml | 21 +- .../xui/en-us/floater_chat_history2.xml | 106 + linden/indra/newview/viewer_manifest.py | 74 +- .../win_crash_logger/llcrashloggerwindows.cpp | 4 +- 163 files changed, 34650 insertions(+), 3115 deletions(-) create mode 100644 ChangeLog.txt rename linden/indra/newview/{RainbowViewer.nib => CoolViewer.nib}/classes.nib (100%) rename linden/indra/newview/{RainbowViewer.nib => CoolViewer.nib}/info.nib (100%) rename linden/indra/newview/{RainbowViewer.nib => CoolViewer.nib}/objects.xib (97%) rename linden/indra/newview/{Info-RainbowViewer.plist => Info-CoolViewer.plist} (93%) rename linden/indra/newview/{Info-RainbowViewerVorbis.plist => Info-CoolViewerVorbis.plist} (91%) create mode 100644 linden/indra/newview/RRInterface.cpp create mode 100644 linden/indra/newview/RRInterface.h create mode 100644 linden/indra/newview/installers/autoit/nrc_install.au3 create mode 100644 linden/indra/newview/installers/autoit/nrc_install.ico create mode 100644 linden/indra/newview/llchatbar.cpp.orig create mode 100644 linden/indra/newview/llfloaterchat.cpp.orig create mode 100644 linden/indra/newview/llimview.cpp.orig create mode 100644 linden/indra/newview/llnotify.cpp.orig create mode 100644 linden/indra/newview/llpanelavatar.cpp.orig create mode 100644 linden/indra/newview/llstatusbar.cpp.orig create mode 100644 linden/indra/newview/llviewermenu.cpp.orig create mode 100644 linden/indra/newview/llviewerwindow.cpp.orig create mode 100644 linden/indra/newview/nrc_install.exe create mode 100644 linden/indra/newview/skins/default/xui/en-us/floater_chat_history2.xml create mode 100644 linden/indra/newview/skins/default/xui/en-us/floater_friends.xml create mode 100644 linden/indra/newview/skins/default/xui/en-us/floater_groups.xml create mode 100644 linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml.orig create mode 100644 linden/indra/newview/skins/default/xui/en-us/panel_audio2.xml create mode 100644 linden/indra/newview/skins/default/xui/en-us/panel_music_remote.xml create mode 100644 linden/indra/newview/skins/default/xui/en-us/panel_status_bar2.xml create mode 100644 linden/indra/newview/skins/default/xui/en-us/panel_toolbar1.xml create mode 100644 linden/indra/newview/skins/default/xui/en-us/panel_toolbar2.xml create mode 100644 linden/indra/newview/skins/silver/xui/en-us/floater_chat_history2.xml diff --git a/ChangeLog.txt b/ChangeLog.txt new file mode 100644 index 0000000..5b65549 --- /dev/null +++ b/ChangeLog.txt @@ -0,0 +1,48 @@ +2009-12-27 Boy Lane + + * Created new branch CV_1.22.12.0 + + +2009-12-25 Boy Lane + + * Release notes added + + modified: RELEASE_NOTES.txt + + + * OpenGL fixes applied for better ATI and other newer graphic cards support + + modified: linden/indra/llrender/llgl.cpp + modified: linden/indra/llwindow/GL/glh_genext.h + modified: linden/indra/newview/llappviewerwin32.cpp + modified: linden/indra/newview/llviewerjointmesh.cpp + modified: linden/doc/contributions.txt + + + * fixed problem with saving of settings, some were not stored + + modified: linden/indra/newview/prefsrainbow.cpp + modified: linden/indra/newvie/llfloaterpreference.cpp + + + * added missing PlayTypingSound toggle + + modified: linden/indra/newview/skins/default/xui/en-us/panel_preferences_rainbow.xml + modified: linden/indra/newview/prefsrainbow.cpp + + + * added missing RLV restriction for the last owner profile in Edit/General floater + + modified: linden/indra/newview/llpanelpermissions.cpp + + + * added small AutoIt installer for non-redistributable components + + new file: linden/indra/newview/nrc_install.exe + new file: linden/indra/newview/installer/autoit/nrc_install.au3 + new file: linden/indra/newview/installer/autoit/nrc_install.ico + + + * added ChangeLog.txt + + new file: ChangeLog.txt diff --git a/README.txt b/README.txt index 9fcae5c..2dcccd2 100644 --- a/README.txt +++ b/README.txt @@ -1,11 +1,7 @@ -RAINBOW MASTER 1.22.12.0 +COOL VIEWER 1.22.12.0 R11 -That's the current baseline for all Rainbow and Cool Viewers. +That's Cool Viewer 1.22.12.0 Release 11. Please have a look at the RELEASE_NOTES.txt and ChangeLog.txt for included changes and patches. -*too be created* - -This is the first upload to github and I'm still figuring out how it works :). - Boy diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt index 3fe632b..9776f30 100644 --- a/RELEASE_NOTES.txt +++ b/RELEASE_NOTES.txt @@ -1,7 +1,136 @@ -RAINBOW MASTER 1.22.12.0 +Release Notes for Rainbow Viewer Cool Edition 1.22.12.0 Release 11, Dec 26th 2009 +================================================================================ +http://my.opera.com/boylane (blog) +http://coolviewer.googlecode.com (installers) +http://github.com/boy (source code) -25 Dec 2009 -First public release of new 1.22.12.0 viewer baseline. -Full functionality included (or so I hope). No RLV. +This viewer includes many patches and changes from a lot of different people and sources which I am very grateful +to be able to use. Credits are given to everyone I know, in case I missed someone I sincerely appologize. + +Thanks to Henri Beauchamp who laid the foundation for this viewer with his Cool SL Viewer. Special thanks to +Winter Ventura for the Cool Viewer logo and Jacek Antonelli and Peter Stindberg for the Rainbow Viewer logo :). +And to all the others who helped and supported me. + + +Patches by Aimee Trescothick: +* AmbiantMasterVolume: Fixes the issue with ambiant sounds not being affected by the master volume (VWR-4371). +* TexturePreviewAspectRatio: Implements an aspect ratio combo in the texture preview floater (VWR-8008). + +Patches by Alissa Sabre: +* FilePickerLocaleCrash: fixes a crash bug in the file picker dealing with accented characters and bad locale (VWR-5575). +* LlfontglRenderWrongParams: fixes a wrong parameter list in a llfontgl function (VWR-9517). + +Patches by Boy Lane: +* AdultCompatibility: backport of the adult compliancy protocols introduced in the v1.23 viewer to 1.22, adaption of Henri Beauchamps AdultCompliance patch, allowing to get search results for and access to adult stuff when your avatar is "adult verified". +* AvatarHeight: backport from Emerald, this show the avatar height in the appearance panel +* AvatarUUID: based on a feature from the Emerald viewer, this patch shows the key of avatars in the "2nd Life" tab of the Profile panel. +* CompilerOmitFramePointers: fix some default compiler optimizations. +* GPU_Table: adds a new GPU table of supported graphic cards from Snowglobe +* RVAdditionalChanges: lots of changes under the hood. +* NotecardHandlingChanges: backport of the notecard behaviour from 1.23.5 mandatory update to 1.22. +* OpenGL-SSE: fixes SSE activation and OpenGL for improved support and speed (!) of ATI and other newer graphic cards. +* OpenJPEG 1.3: update to the faster OpenJPEG 1.3 libs +* Radar: Adaption of Dale Glass' radar with additional modifications by Henru Beauchamp to the 1.22 viewer. +* RainbowFeatures: based on Henri's Cool SL Viewer, adds a preferences menu to control additional viewer features. +* SkinPreferences: based on Emerald, this adds some nice skins to the preferences menu. +* Windlight Presets: not actually a patch but a huge amount of windlight presets made by several people to choose from + +Patches by Gigs Taggart: +* Duckwalk: cosmetic patch for the "duck walk" of AO-less avatars (VWR-1603). +* LostConnectionOnLogin: fixes spurious "crashes" (disconnections) on login (VWR-8783). + +Patches by Henri Beauchamp: +* AllowDiscardForCreator: enables the "Discard" button in the notecards that you created and that are given to you with llGiveInventory(). Fixes the VWR-2290 bug. +* CommonDateAndTimeFormats: allows to configure the time and date formats and to use them coherently everywhere in the viewer (fixes VWR-721 among others). +* DefaultSaveLoadDirectory: use the HOME directory by default for saving pictures or uploading pictures, animations and sounds, instead of the viewer installation directory. +* DefaultToFmod: under Linux, makes sure the Fmod sound wrapper is used by default (this can be changed back by editing the "secondlife" wrapper script), since the new OpenAL support is still very flacky on most hardware/distro. +* DrawDistanceInCameraControls: Adds a draw distance spinner in the camera controls floater, for easy adjustements. +* FetchInventoryOnLogin: allows to fetch and cache the inventory in the background upon login (prevents "loading..." delays later on, when opening rarely used folders in your inventory). +* gcc43-Warnings: allow to compile the v1.22 and v1.23 viewers with gcc v4.3. +* HideIMinChatConsole: allows to optionally prevent IMs to show in the main chat. Implements the VWR-3060 feature. +* HideNotificationsInChat: allows to optionally prevent the notifications (those small messages appearing in a blue box on the lower right corner of the viewer window) to show and be logged in the main chat. +* InventoryDoubleClickActions: defines double-click actions in inventory for objects (wear as attachments or remove if already worn), and clothes/body parts (wear when not worn, or remove when worn). Implements the VWR-1752 and part of the VWR-1825 features. +* InventoryDoubleClickActions_RestrainedLife_addon.patch.bz2: addon patch for usage restrictions with RestrainedLife active. +* KeepCachedSounds: cures the sound problems in -multiple mode, and allows to keep cached sounds over sessions. Fixes the VWR-2876 bug. +* LandmarksDiscardButton: restores the "Discard" button in the new landmarks floater. Fixes the VWR-3616 regression. +* LargePrims: allows to build large prims (up to 256m large) in OpenSim. +* MaxNetworkBandwidth: unleashes the maximum network bandwidth, preventing the repetitive throttling by the viewer (which slows down rezing compared to what it can be on high speed connections). Note: setting the max bandwidth to 4Mbps or so should be more than enough as I never saw more than 2.5 Mbps used by the viewer (the bandwidth is also limited server side anyway as it depends on the number of residents in the sim and on the network link speed for this sim). +* MoonBrightness: corrects the brightness of the moon, allowing to actually see it, especially when it's close to the horizon. +* MouseLookFocusSwitchQuirk: Fixes quirks with the SL viewer window focus switching not properly restoring mouse-look and resetting the camera zoom level (fixes VWR-14666 among others). +* MUposeStyleAndOOCautoClose: allows to use the MUCK/MUSH/MUX/MUD pose style (VWR-3093) and allows to auto-close double-parenthesis (Out Of Character) chat/IM poses. +* NewNotecardSaveButton: adds a "Save" button to new/received notecards. +* NoMultipleLocaleWarnings: prevents messages such as "WARNING: LLLocale: Failed to set locale en_US.utf8" to appear hundreds of times in the log file (any locale loading failure now appears once only in the log). +* OldTrackingDotsInMinimap: reinstates the "old" (pre-v1.18.4) mini-map icons for "above" and "below" avatars. Fixes the VWR-2808 regression. Set the "UseOldTrackingDots" flag to TRUE, and restart the viewer to enable this feature. +* PrivateLookAt: Adds a PrivateLookAt setting to prevent your avatar to focus its eyes and point its arm to objects or avatars beyond 20m of distance (since this is usually unwanted or simply random (hovering mouse cursor in the background). This also to defeats the spying tools developed in some viewers (they can display where everyone is looking at). +* Radar_RestrainedLife_addon: addon patch for usage restrictions of Radar with RestrainedLife active. +* ReinstateOldSearchTabs (not needed for v1.19 and older): reinstates the "All (Old)" search tab as well as the old style (non-web) Groups search tab. +* ReinstateShowTextureUUID: reverts the "fix" for VWR-1919: security by opacity is a delusion: removing this feature would not prevent pirates to steal your textures, while it would prevent you to verify that some object has been textured with your own textures. And by the way, there are much better (much more efficient) ways for a pirate to steal the textures (by using the cached files, for example)... +* RememberMinimizedFloatersPosition: Fixes the VWR-5530 regression (minimized floaters not remembering their position). +* RevertUIchanges: this (large) patch reinstates the "old" (pre-voice) UI and adds some more features: +- Features common to all versions: +-- The chat input line, Gestures combo and Say/Shout buttons are removed from the chat history floater (this feature can be disabled by setting "UseOldChatHistory" to FALSE and restarting the viewer). +-- The friends list and the groups list are back as separate floaters that can both be shown simultaneously. As a bonus the Groups list floater also remembers its size and position (just like the friends list always did). +-- The toolbar is back to its old self (no distracting and cryptic icons and "fly buttons"), with the "Friends" button back into business, as well as (for those among you "old" enough to remember), the "Groups" button (if you don't like it, it can be hidden by setting "ShowGroupsButton" to FALSE and restarting the viewer). +-- The overlay bar (chat input line, buttons and volume/media remote controls) is back to its old self, with a few bonuses: the volume remote buttons stack nicely and "smartly" to the right above the chatbar (or toolbar if the chatbar is hidden), depending on which is actually needed (media, music and voice remotes are hidden by default and shown only when needed). The master volume button was also made smaller (slider removed: only the tiny button allowing to open the volume sliders panel is shown) and smarter (it is only shown whenever one of the music, media or voice are enabled/playing, but it can be shown permanently like it used to do in v1.18.6 by setting "HideMasterRemote" to FALSE). +- Features for v1.21 and later: +-- Includes the StatusBarIcons patch (but allows to switch back to the new status bar icons, by setting "UseOldStatusbarIcons" to FALSE). +-- Allow the proper fonctionning of the packets loss and bandwidth tooltips. +-- Reverts to the default chat colors and behaviours of pre-v1.21 viewers. +-- Removal of the extra spacing between message lines in the chat console (unless "DisableMessagesSpacing" is set to FALSE). +* SaveScriptsAsMono: Allows to save scripts in inventory as Mono scripts instead of LSL2 (when the SaveScriptsAsMono setting is set to TRUE). Fixes VWR-8827. +* TeleportHistory_RestrainedLife_addon: addon patch for usage restrictions of TeleportHistory with RestrainedLife active. + +Patches by Kitty Barnet: +* BuildFloaterMouseLookQuirk: Fixes a quirk with mouse-look in build mode (VWR-14767). +* PanelLoginFocusedGridSelectionCrash: fixes a crash bug when quitting the viewer while the grid selection combo is selected (VWR-14765). + +Patches by Marine Kelley: +* RestrainedLife_v1.22.1 with improvements by Henri Beauchamp + +Patches by McCabe Maxsted: +* ExpandedBuildTools: adds a "Slice" setting to boxes, cylinders and prisms (VWR-7827), lowers the increments for path cut and dimple to 0.025 (VWR-7877) and for texture offsets to 0.05 (new in v2, by Henri Beauchamp). +* FriendshipAndCallingcardOffersIgnoreButton: adds an "Ignore" button to friendsh.ip and calling cards proposal dialogs (VWR-4826). +* MissingKeyword: fixes the problem with PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS not being properly highlighted in the script editor (VWR-8454). + +Patches by Michelle2 Zenovka: +* BulkSetPermissions: implements bulk permissions setting (VWR-5082). + +Patches by Nicholaz Beresford: +* DebugSettingsShortcutCtrlAltS: adds a keyboard shortcut (CTRL ALT S) to pop up the Debug Settings panel. +* LpecRpecSwapped: fixes the ATTACH_LPEC/ATTACH_RPEC wrong (swapped) constants in the LSL editor (SVC-580). +* PossibleCrashAndLeakAssetStorage: fixes a potential crash and a memory leak. +* PossibleCrashDragAndDrop: fixes a potential crash (VWR-2003). +* PossibleCrashGroupVoting: fixes a potential crash (VWR-2543). +* PossibleCrashSpeakerList: fixes a potential crash (VWR-2683). +* ShiftEscResetsCameraView: allows to reset the camera view with SHIFT ESC and does not close the chat input line when doing so. +* TextureCacheHiccups: fixes texture caching quirks. Also includes the CacheSmallTextures patch by Robin Cornelius. +* TextureConsoleCleanupLayout: Fixed display of texture console (CTRL-SHIFT-3) +* WorkerThreadWhenTerminating: fixes a thread quirk (VWR-1294). + +Patches by Zi Ree: +* EditKeysInDialogs: fixes a problem with unsupported DEL key in some dialogs (VWR-9127). +* TeleportHistory: adds a teleport history floater (VWR-7913). +* VisitedLandmarks: fixes a long standing bug (dating back from 2007) with landmarks icon failing to turn red after use and with the position beacon failing to appear on arrival on first use of the LM (VWR-7896). + +Miscellaneous patches: +* DoubleClickTeleport (unknown author: from Emerald viewer): implements a double-click teleport feature (double-clicking in world, teleports you at the mouse pointer position, provided the parcel teleport routing allows it). This also makes the "Go To" pie menu use teleport instead of auto-pilot. +* FlexibleSculpties (by Zwagoth Klaar & Qarl Linden): implements flexible sculpties (BEWARE: flexible sculpties introduce a *lot* of lag on the viewer side: use sparsely!). Implements VWR-9203. +* ForceSitOnGround: based on Emerald, reimplemented by Henri, Beauchamp, this patch allows to sit down anywhere "on the ground" (and not just on actual land ground). Adds a new "Sit On Ground" entry in the "World" menu, bound to a new CTRL ALT SHIFT S shortcut. +* LinuxShortcuts: based on a patch by Khyota Wulluf, this improved patch changes some shortcuts which collide with Linux console switching keys (CTRL ALT Fn shortcuts are turned into CTRL SHIFT Fn). See VWR-2085. +* LLFaceVerifyCrash: backport from v1.23 of a fix for a possible crash bug when teleporting. +* LlhttpclientMemLeak: based on a patch by Carjay McGinnis, this patch plugs a couple of memory leaks (VWR-9400). +* LLimageTGA_DeleteColorMapFix (by Aleric Inglewood): fixes a memory leak (VWR-10837). +* LlmediaImplGstreamerFixes: aggregates patches from Tofu Linden (VWR-10370), Aleric Inglewood (VWR-10759). +* LoadingContentsContextMenuCrash (for v1.22 and older): backport from v1.23 of a fix to a bug which makes the viewer crash when reloading the contents tab of the edit tools floater while the context menu is pulled down. +* LocalRulerAlignment(by Jacek Antonelli): Fixes a problem with the edit tools in "Local" ruler mode (VWR-1852). +* MoreGridsDynamic: with code from JB Kraft and Robin Cornelius. This patches implements dynamic grids list loading (from grids.xml) to allow choosing between SecondLife and OpenSim grids from the login screen (VWR-7531). +* OblongSculptiesDetails: based on a patch by Nicholaz Beresford, this patch increases the level of details (LOD) for oblong sculpties (sculpties using a sculpt texture with different width and height) when necessary. +* PlayTypingSoundToggle based on a feature of the Emerald viewer: adds a PlayTypingSound toggle setting to disable it when avatars (yours and others') type in chat. +* RemembersStatsPosAndSize (Latif Khalifa): allows to remember the stats floater position and size (VWR-9540). +* RenderDeferred / obsolete OpenGL libs (Luricos Alderton, Boy Lane): fixes OpenGL issues (VWR-12540) +* SendParcelSelectObjectWrongReturnType (by Carjay McGinnis): fixes a wrong type which triggers warnings in the log file (VWR-9620). +* ShiftReturnWhisper (unknown author): implements whispers for avatars via SHIFT+ENTER in the chatbar. +* StuckGroupProposalArchives (by Dale Glass): fixes a problem with group proposal archives viewing (VWR-12532). +* TPabove1000m (by Peter Lameth. For v1.21): fixes a problem with the world map clamping the max altitude to 1000m (VWR-7331). +* WornInventoryTab (by Vadim Bigbear): Adds a "Worn" tab to the inventory floater. Implements VWR-2199, VWR-508. -*details to be added here* diff --git a/linden/doc/contributions.txt b/linden/doc/contributions.txt index 5cc26c2..eda5b7d 100644 --- a/linden/doc/contributions.txt +++ b/linden/doc/contributions.txt @@ -208,6 +208,8 @@ Kage Pixel Kunnis Basiat VWR-82 VWR-102 +Luricos Alderton + VWR-12540 maciek marksman CT-86 march Korda @@ -344,6 +346,7 @@ Ryozu Kojima VWR-287 Sammy Frederix VWR-6186 + VWR-12155 Scrippy Scofield VWR-3748 Seg Baphomet diff --git a/linden/indra/CMakeLists.txt b/linden/indra/CMakeLists.txt index 5e10af0..6e0f533 100644 --- a/linden/indra/CMakeLists.txt +++ b/linden/indra/CMakeLists.txt @@ -13,7 +13,7 @@ if(COMMAND cmake_policy) cmake_policy(SET CMP0003 OLD) endif(COMMAND cmake_policy) -project(RainbowViewer) +project(CoolViewer) set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") @@ -81,7 +81,7 @@ if (VIEWER) endif (LINUX) add_subdirectory(${VIEWER_PREFIX}newview) - add_dependencies(viewer rainbowviewer-bin) + add_dependencies(viewer coolviewer-bin) endif (VIEWER) # Linux builds the viewer and server in 2 separate projects diff --git a/linden/indra/cmake/00-Common.cmake b/linden/indra/cmake/00-Common.cmake index c9863d2..72189c4 100644 --- a/linden/indra/cmake/00-Common.cmake +++ b/linden/indra/cmake/00-Common.cmake @@ -149,7 +149,7 @@ if (LINUX) endif (SERVER) if (VIEWER) - add_definitions(-DAPPID=rainbowviewer) + add_definitions(-DAPPID=coolviewer) add_definitions(-fvisibility=hidden) if (NOT STANDALONE) # this stops us requiring a really recent glibc at runtime diff --git a/linden/indra/cmake/UnixInstall.cmake b/linden/indra/cmake/UnixInstall.cmake index 020ef84..e309f1c 100644 --- a/linden/indra/cmake/UnixInstall.cmake +++ b/linden/indra/cmake/UnixInstall.cmake @@ -21,11 +21,11 @@ if (INSTALL) set(INSTALL_SHARE_DIR ${INSTALL_PREFIX}/share CACHE PATH "Installation directory for read-only shared files.") - set(APP_BINARY_DIR ${INSTALL_LIBRARY_DIR}/rainbowviewer-${viewer_VERSION} + set(APP_BINARY_DIR ${INSTALL_LIBRARY_DIR}/coolviewer-${viewer_VERSION} CACHE PATH "Installation directory for binaries.") - set(APP_SHARE_DIR ${INSTALL_SHARE_DIR}/rainbowviewer-${viewer_VERSION} + set(APP_SHARE_DIR ${INSTALL_SHARE_DIR}/coolviewer-${viewer_VERSION} CACHE PATH "Installation directory for read-only data files.") endif (INSTALL) diff --git a/linden/indra/copy_win_scripts/start-client.py b/linden/indra/copy_win_scripts/start-client.py index 8ecb4fa..4ce2df5 100644 --- a/linden/indra/copy_win_scripts/start-client.py +++ b/linden/indra/copy_win_scripts/start-client.py @@ -32,7 +32,7 @@ def start_client(grid, slurl, build_config, my_args): f = open("start-client.log", "w") print >>f, "Viewer startup arguments:" llstart.start("viewer", "../../newview", - "%s/newview/%s/rainbowviewer-bin.exe" % (build_path, build_config), + "%s/newview/%s/coolviewer-bin.exe" % (build_path, build_config), viewer_args, f) f.close() diff --git a/linden/indra/develop.py b/linden/indra/develop.py index f2cdb40..06cc43d 100755 --- a/linden/indra/develop.py +++ b/linden/indra/develop.py @@ -522,10 +522,10 @@ def get_build_cmd(self): if self.gens[self.generator]['ver'] in [ r'8.0', r'9.0' ]: config = '\"%s|Win32\"' % config - return "buildconsole RainbowViewer.sln /build %s" % config + return "buildconsole CoolViewer.sln /build %s" % config # devenv.com is CLI friendly, devenv.exe... not so much. - return ('"%sdevenv.com" RainbowViewer.sln /build %s' % + return ('"%sdevenv.com" CoolViewer.sln /build %s' % (self.find_visual_studio(), self.build_type)) # this override of run exists because the PlatformSetup version @@ -557,9 +557,9 @@ def run_vstool(self): continue vstool_cmd = (os.path.join('tools','vstool','VSTool.exe') + ' --solution ' + - os.path.join(build_dir,'RainbowViewer.sln') + + os.path.join(build_dir,'CoolViewer.sln') + ' --config ' + self.build_type + - ' --startup rainbowviewer-bin') + ' --startup coolviewer-bin') print 'Running %r in %r' % (vstool_cmd, getcwd()) self.run(vstool_cmd) print >> open(stamp, 'w'), self.build_type diff --git a/linden/indra/linux_crash_logger/llcrashloggerlinux.cpp b/linden/indra/linux_crash_logger/llcrashloggerlinux.cpp index cf11867..d4b4814 100644 --- a/linden/indra/linux_crash_logger/llcrashloggerlinux.cpp +++ b/linden/indra/linux_crash_logger/llcrashloggerlinux.cpp @@ -53,13 +53,13 @@ // These need to be localized. static const char dialog_text[] = -"Rainbow Viewer appears to have crashed or frozen last time it ran.\n" -"This crash reporter collects information about your computer's hardware, operating system, and some Rainbow Viewer logs, all of which are used for debugging purposes only.\n" +"Cool Viewer appears to have crashed or frozen last time it ran.\n" +"This crash reporter collects information about your computer's hardware, operating system, and some Cool Viewer logs, all of which are used for debugging purposes only.\n" "\n" "Send crash report?"; static const char dialog_title[] = -"Rainbow Viewer Crash Logger"; +"Cool Viewer Crash Logger"; #if LL_GTK static void response_callback (GtkDialog *dialog, diff --git a/linden/indra/llrender/llgl.cpp b/linden/indra/llrender/llgl.cpp index a9cf073..a296ea0 100644 --- a/linden/indra/llrender/llgl.cpp +++ b/linden/indra/llrender/llgl.cpp @@ -109,10 +109,6 @@ PFNGLGETQUERYIVARBPROC glGetQueryivARB = NULL; PFNGLGETQUERYOBJECTIVARBPROC glGetQueryObjectivARB = NULL; PFNGLGETQUERYOBJECTUIVARBPROC glGetQueryObjectuivARB = NULL; -// GL_ARB_point_parameters -PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB = NULL; -PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB = NULL; - // GL_EXT_framebuffer_object PFNGLISRENDERBUFFEREXTPROC glIsRenderbufferEXT = NULL; PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT = NULL; @@ -244,10 +240,6 @@ PFNGLBINDATTRIBLOCATIONARBPROC glBindAttribLocationARB = NULL; PFNGLGETACTIVEATTRIBARBPROC glGetActiveAttribARB = NULL; PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB = NULL; -#if LL_WINDOWS -PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = NULL; -#endif - #if LL_LINUX PFNGLCOLORTABLEEXTPROC glColorTableEXT = NULL; #endif // LL_LINUX @@ -588,7 +580,7 @@ void LLGLManager::initExtensions() mHasFramebufferObject = ExtensionExists("GL_EXT_framebuffer_object", gGLHExts.mSysExts) && ExtensionExists("GL_EXT_packed_depth_stencil", gGLHExts.mSysExts); #if !LL_DARWIN - mHasPointParameters = !mIsATI && ExtensionExists("GL_ARB_point_parameters", gGLHExts.mSysExts); + mHasPointParameters = ExtensionExists("GL_ARB_point_parameters", gGLHExts.mSysExts); #endif mHasShaderObjects = ExtensionExists("GL_ARB_shader_objects", gGLHExts.mSysExts) && ExtensionExists("GL_ARB_shading_language_100", gGLHExts.mSysExts); mHasVertexShader = ExtensionExists("GL_ARB_vertex_program", gGLHExts.mSysExts) && ExtensionExists("GL_ARB_vertex_shader", gGLHExts.mSysExts) @@ -711,8 +703,8 @@ void LLGLManager::initExtensions() } if (mIsATI && mHasMipMapGeneration) { - LL_INFOS("RenderInit") << "Disabling mip-map generation for ATI GPUs (performance opt)" << LL_ENDL; - mHasMipMapGeneration = FALSE; + LL_INFOS("RenderInit") << "__NOT__ Disabling mip-map generation for ATI GPUs (performance opt)" << LL_ENDL; + //mHasMipMapGeneration = FALSE; } // Misc diff --git a/linden/indra/llvfs/lldir.cpp b/linden/indra/llvfs/lldir.cpp index f061cd0..4fcfb30 100644 --- a/linden/indra/llvfs/lldir.cpp +++ b/linden/indra/llvfs/lldir.cpp @@ -229,7 +229,7 @@ const std::string LLDir::getCacheDir(bool get_default) const } else { - res = getOSCacheDir() + mDirDelimiter + "RainbowViewer"; + res = getOSCacheDir() + mDirDelimiter + "CoolViewer"; } return res; } @@ -589,7 +589,7 @@ void LLDir::setSkinFolder(const std::string &skin_folder) mSkinDir += skin_folder; // user modifications to current skin - // e.g. c:\documents and settings\users\username\application data\rainbowviewer\skins\dazzle + // e.g. c:\documents and settings\users\username\application data\coolviewer\skins\dazzle mUserSkinDir = getOSUserAppDir(); mUserSkinDir += mDirDelimiter; mUserSkinDir += "skins"; @@ -597,7 +597,7 @@ void LLDir::setSkinFolder(const std::string &skin_folder) mUserSkinDir += skin_folder; // base skin which is used as fallback for all skinned files - // e.g. c:\program files\rainbowviewer\skins\default + // e.g. c:\program files\coolviewer\skins\default mDefaultSkinDir = getAppRODataDir(); mDefaultSkinDir += mDirDelimiter; mDefaultSkinDir += "skins"; diff --git a/linden/indra/llvfs/lldir_linux.cpp b/linden/indra/llvfs/lldir_linux.cpp index 719e37a..7a97c01 100644 --- a/linden/indra/llvfs/lldir_linux.cpp +++ b/linden/indra/llvfs/lldir_linux.cpp @@ -127,7 +127,7 @@ LLDir_Linux::LLDir_Linux() } } - // *TODO: don't use /tmp, use $HOME/.rainbowviewer/tmp or something. + // *TODO: don't use /tmp, use $HOME/.coolviewer/tmp or something. mTempDir = "/tmp"; } @@ -148,7 +148,7 @@ void LLDir_Linux::initAppDirs(const std::string &app_name) char* app_home_env = getenv((upper_app_name + "_USER_DIR").c_str()); /* Flawfinder: ignore */ if (app_home_env) { - // user has specified own userappdir i.e. $RAINBOWVIEWER_USER_DIR + // user has specified own userappdir i.e. $COOLVIEWER_USER_DIR mOSUserAppDir = app_home_env; } else diff --git a/linden/indra/llwindow/GL/glh_genext.h b/linden/indra/llwindow/GL/glh_genext.h index 8d42025..11a5069 100644 --- a/linden/indra/llwindow/GL/glh_genext.h +++ b/linden/indra/llwindow/GL/glh_genext.h @@ -1,1671 +1,3802 @@ -/* - * glh_genext.h - * From nVidia Corporation, downloaded 2006-12-18 from: - * http://developer.nvidia.com/attach/8196 - * ("NVParse Library with Source (.zip) (2390 KB)") - * - * License (quoted from license_info.txt in aforementioned file): - * "The files bison.exe, bison.simple, and flex.exe are covered by - * the GPL. All other files in this distribution can be used however - * you want." - */ - -/* File generated by extgen.cpp -- do not modify */ -#ifndef GLH_GENEXT_H -#define GLH_GENEXT_H - -// MBW -- None of this is necessary on Mac OS. -#ifndef __APPLE__ - -#include -#include - -#ifdef _WIN32 /* supports windows, x -- need to generalize */ -# include -# define GLH_EXT_GET_PROC_ADDRESS(p) wglGetProcAddress(p) -#else if GLX_VERSION_1_3 -# include -# define GLH_EXT_GET_PROC_ADDRESS(p) glXGetProcAddressARB(p) -#endif - -#ifdef GLH_EXT_SINGLE_FILE - #define GLH_EXTERN - #define GLH_INITIALIZER = 0 -#else - #define GLH_EXTERN extern - #define GLH_INITIALIZER -#endif - -#define GLH__PREPROCESSOR_GYMNASTICS2(a,b) a##b -#define GLH__PREPROCESSOR_GYMNASTICS(a,b) GLH__PREPROCESSOR_GYMNASTICS2(a,b) - -#ifndef GLH_EXT_PREFIX -# define GLH_EXT_NAME(a) a -#else -# define GLH_EXT_NAME(a) GLH__PREPROCESSOR_GYMNASTICS(GLH_EXT_PREFIX,a) -#endif - -#ifndef _WIN32 -# ifndef GLH_CORE_1_2_PREFIX -# define GLH_CORE_1_2_PREFIX _ -# endif -#endif - -#ifndef GLH_CORE_1_2_PREFIX -# define GLH_CORE_1_2_NAME(a) a -#else -# define GLH_CORE_1_2_NAME(a) GLH__PREPROCESSOR_GYMNASTICS(GLH_CORE_1_2_PREFIX,a) -#endif - -#ifdef GL_ARB_multitexture - GLH_EXTERN PFNGLMULTITEXCOORD1DARBPROC GLH_EXT_NAME(glMultiTexCoord1dARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1DVARBPROC GLH_EXT_NAME(glMultiTexCoord1dvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1FARBPROC GLH_EXT_NAME(glMultiTexCoord1fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1FVARBPROC GLH_EXT_NAME(glMultiTexCoord1fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1IARBPROC GLH_EXT_NAME(glMultiTexCoord1iARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1IVARBPROC GLH_EXT_NAME(glMultiTexCoord1ivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1SARBPROC GLH_EXT_NAME(glMultiTexCoord1sARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD1SVARBPROC GLH_EXT_NAME(glMultiTexCoord1svARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2DARBPROC GLH_EXT_NAME(glMultiTexCoord2dARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2DVARBPROC GLH_EXT_NAME(glMultiTexCoord2dvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2FARBPROC GLH_EXT_NAME(glMultiTexCoord2fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2FVARBPROC GLH_EXT_NAME(glMultiTexCoord2fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2IARBPROC GLH_EXT_NAME(glMultiTexCoord2iARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2IVARBPROC GLH_EXT_NAME(glMultiTexCoord2ivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2SARBPROC GLH_EXT_NAME(glMultiTexCoord2sARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD2SVARBPROC GLH_EXT_NAME(glMultiTexCoord2svARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3DARBPROC GLH_EXT_NAME(glMultiTexCoord3dARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3DVARBPROC GLH_EXT_NAME(glMultiTexCoord3dvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3FARBPROC GLH_EXT_NAME(glMultiTexCoord3fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3FVARBPROC GLH_EXT_NAME(glMultiTexCoord3fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3IARBPROC GLH_EXT_NAME(glMultiTexCoord3iARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3IVARBPROC GLH_EXT_NAME(glMultiTexCoord3ivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3SARBPROC GLH_EXT_NAME(glMultiTexCoord3sARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD3SVARBPROC GLH_EXT_NAME(glMultiTexCoord3svARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4DARBPROC GLH_EXT_NAME(glMultiTexCoord4dARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4DVARBPROC GLH_EXT_NAME(glMultiTexCoord4dvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4FARBPROC GLH_EXT_NAME(glMultiTexCoord4fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4FVARBPROC GLH_EXT_NAME(glMultiTexCoord4fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4IARBPROC GLH_EXT_NAME(glMultiTexCoord4iARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4IVARBPROC GLH_EXT_NAME(glMultiTexCoord4ivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4SARBPROC GLH_EXT_NAME(glMultiTexCoord4sARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTITEXCOORD4SVARBPROC GLH_EXT_NAME(glMultiTexCoord4svARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLACTIVETEXTUREARBPROC GLH_EXT_NAME(glActiveTextureARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLCLIENTACTIVETEXTUREARBPROC GLH_EXT_NAME(glClientActiveTextureARB) GLH_INITIALIZER; -#endif - -#ifdef GL_ARB_texture_border_clamp -#endif - -#ifdef GL_ARB_texture_compression - GLH_EXTERN PFNGLCOMPRESSEDTEXIMAGE3DARBPROC GLH_EXT_NAME(glCompressedTexImage3DARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMPRESSEDTEXIMAGE2DARBPROC GLH_EXT_NAME(glCompressedTexImage2DARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMPRESSEDTEXIMAGE1DARBPROC GLH_EXT_NAME(glCompressedTexImage1DARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC GLH_EXT_NAME(glCompressedTexSubImage3DARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC GLH_EXT_NAME(glCompressedTexSubImage2DARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC GLH_EXT_NAME(glCompressedTexSubImage1DARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETCOMPRESSEDTEXIMAGEARBPROC GLH_EXT_NAME(glGetCompressedTexImageARB) GLH_INITIALIZER; -#endif - -#ifdef GL_ARB_texture_cube_map -#endif - -#ifdef GL_ARB_transpose_matrix - GLH_EXTERN PFNGLLOADTRANSPOSEMATRIXFARBPROC GLH_EXT_NAME(glLoadTransposeMatrixfARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLLOADTRANSPOSEMATRIXDARBPROC GLH_EXT_NAME(glLoadTransposeMatrixdARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTTRANSPOSEMATRIXFARBPROC GLH_EXT_NAME(glMultTransposeMatrixfARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLMULTTRANSPOSEMATRIXDARBPROC GLH_EXT_NAME(glMultTransposeMatrixdARB) GLH_INITIALIZER; -#endif - -#ifdef GL_ARB_vertex_program - GLH_EXTERN PFNGLVERTEXATTRIB1SARBPROC GLH_EXT_NAME(glVertexAttrib1sARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1FARBPROC GLH_EXT_NAME(glVertexAttrib1fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1DARBPROC GLH_EXT_NAME(glVertexAttrib1dARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2SARBPROC GLH_EXT_NAME(glVertexAttrib2sARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2FARBPROC GLH_EXT_NAME(glVertexAttrib2fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2DARBPROC GLH_EXT_NAME(glVertexAttrib2dARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3SARBPROC GLH_EXT_NAME(glVertexAttrib3sARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3FARBPROC GLH_EXT_NAME(glVertexAttrib3fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3DARBPROC GLH_EXT_NAME(glVertexAttrib3dARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4SARBPROC GLH_EXT_NAME(glVertexAttrib4sARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4FARBPROC GLH_EXT_NAME(glVertexAttrib4fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4DARBPROC GLH_EXT_NAME(glVertexAttrib4dARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4NUBARBPROC GLH_EXT_NAME(glVertexAttrib4NubARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1SVARBPROC GLH_EXT_NAME(glVertexAttrib1svARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1FVARBPROC GLH_EXT_NAME(glVertexAttrib1fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1DVARBPROC GLH_EXT_NAME(glVertexAttrib1dvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2SVARBPROC GLH_EXT_NAME(glVertexAttrib2svARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2FVARBPROC GLH_EXT_NAME(glVertexAttrib2fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2DVARBPROC GLH_EXT_NAME(glVertexAttrib2dvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3SVARBPROC GLH_EXT_NAME(glVertexAttrib3svARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3FVARBPROC GLH_EXT_NAME(glVertexAttrib3fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3DVARBPROC GLH_EXT_NAME(glVertexAttrib3dvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4BVARBPROC GLH_EXT_NAME(glVertexAttrib4bvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4SVARBPROC GLH_EXT_NAME(glVertexAttrib4svARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4IVARBPROC GLH_EXT_NAME(glVertexAttrib4ivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4UBVARBPROC GLH_EXT_NAME(glVertexAttrib4ubvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4USVARBPROC GLH_EXT_NAME(glVertexAttrib4usvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4UIVARBPROC GLH_EXT_NAME(glVertexAttrib4uivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4FVARBPROC GLH_EXT_NAME(glVertexAttrib4fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4DVARBPROC GLH_EXT_NAME(glVertexAttrib4dvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4NBVARBPROC GLH_EXT_NAME(glVertexAttrib4NbvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4NSVARBPROC GLH_EXT_NAME(glVertexAttrib4NsvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4NIVARBPROC GLH_EXT_NAME(glVertexAttrib4NivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4NUBVARBPROC GLH_EXT_NAME(glVertexAttrib4NubvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4NUSVARBPROC GLH_EXT_NAME(glVertexAttrib4NusvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4NUIVARBPROC GLH_EXT_NAME(glVertexAttrib4NuivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBPOINTERARBPROC GLH_EXT_NAME(glVertexAttribPointerARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLENABLEVERTEXATTRIBARRAYARBPROC GLH_EXT_NAME(glEnableVertexAttribArrayARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLDISABLEVERTEXATTRIBARRAYARBPROC GLH_EXT_NAME(glDisableVertexAttribArrayARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMSTRINGARBPROC GLH_EXT_NAME(glProgramStringARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLBINDPROGRAMARBPROC GLH_EXT_NAME(glBindProgramARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLDELETEPROGRAMSARBPROC GLH_EXT_NAME(glDeleteProgramsARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGENPROGRAMSARBPROC GLH_EXT_NAME(glGenProgramsARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMENVPARAMETER4DARBPROC GLH_EXT_NAME(glProgramEnvParameter4dARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMENVPARAMETER4DVARBPROC GLH_EXT_NAME(glProgramEnvParameter4dvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMENVPARAMETER4FARBPROC GLH_EXT_NAME(glProgramEnvParameter4fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMENVPARAMETER4FVARBPROC GLH_EXT_NAME(glProgramEnvParameter4fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMLOCALPARAMETER4DARBPROC GLH_EXT_NAME(glProgramLocalParameter4dARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMLOCALPARAMETER4DVARBPROC GLH_EXT_NAME(glProgramLocalParameter4dvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMLOCALPARAMETER4FARBPROC GLH_EXT_NAME(glProgramLocalParameter4fARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMLOCALPARAMETER4FVARBPROC GLH_EXT_NAME(glProgramLocalParameter4fvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPROGRAMENVPARAMETERDVARBPROC GLH_EXT_NAME(glGetProgramEnvParameterdvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPROGRAMENVPARAMETERFVARBPROC GLH_EXT_NAME(glGetProgramEnvParameterfvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC GLH_EXT_NAME(glGetProgramLocalParameterdvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC GLH_EXT_NAME(glGetProgramLocalParameterfvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPROGRAMIVARBPROC GLH_EXT_NAME(glGetProgramivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPROGRAMSTRINGARBPROC GLH_EXT_NAME(glGetProgramStringARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETVERTEXATTRIBDVARBPROC GLH_EXT_NAME(glGetVertexAttribdvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETVERTEXATTRIBFVARBPROC GLH_EXT_NAME(glGetVertexAttribfvARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETVERTEXATTRIBIVARBPROC GLH_EXT_NAME(glGetVertexAttribivARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETVERTEXATTRIBPOINTERVARBPROC GLH_EXT_NAME(glGetVertexAttribPointervARB) GLH_INITIALIZER; - GLH_EXTERN PFNGLISPROGRAMARBPROC GLH_EXT_NAME(glIsProgramARB) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_abgr -#endif - -#ifdef GL_EXT_bgra -#endif - -#ifdef GL_EXT_blend_color - GLH_EXTERN PFNGLBLENDCOLOREXTPROC GLH_EXT_NAME(glBlendColorEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_blend_minmax - GLH_EXTERN PFNGLBLENDEQUATIONEXTPROC GLH_EXT_NAME(glBlendEquationEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_blend_subtract -#endif - -#ifdef GL_EXT_compiled_vertex_array - GLH_EXTERN PFNGLLOCKARRAYSEXTPROC GLH_EXT_NAME(glLockArraysEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLUNLOCKARRAYSEXTPROC GLH_EXT_NAME(glUnlockArraysEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_fog_coord - GLH_EXTERN PFNGLFOGCOORDDEXTPROC GLH_EXT_NAME(glFogCoorddEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLFOGCOORDDVEXTPROC GLH_EXT_NAME(glFogCoorddvEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLFOGCOORDFEXTPROC GLH_EXT_NAME(glFogCoordfEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLFOGCOORDFVEXTPROC GLH_EXT_NAME(glFogCoordfvEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLFOGCOORDPOINTEREXTPROC GLH_EXT_NAME(glFogCoordPointerEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_light_max_exponent -#endif - -#ifdef GL_EXT_packed_pixels -#endif - -#ifdef GL_EXT_paletted_texture - GLH_EXTERN PFNGLCOLORSUBTABLEEXTPROC GLH_EXT_NAME(glColorSubTableEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOLORTABLEEXTPROC GLH_EXT_NAME(glColorTableEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETCOLORTABLEEXTPROC GLH_EXT_NAME(glGetColorTableEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETCOLORTABLEPARAMETERFVEXTPROC GLH_EXT_NAME(glGetColorTableParameterfvEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETCOLORTABLEPARAMETERIVEXTPROC GLH_EXT_NAME(glGetColorTableParameterivEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_point_parameters - GLH_EXTERN PFNGLPOINTPARAMETERFEXTPROC GLH_EXT_NAME(glPointParameterfEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLPOINTPARAMETERFVEXTPROC GLH_EXT_NAME(glPointParameterfvEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_rescale_normal -#endif - -#ifdef GL_EXT_secondary_color - GLH_EXTERN PFNGLSECONDARYCOLOR3BEXTPROC GLH_EXT_NAME(glSecondaryColor3bEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3BVEXTPROC GLH_EXT_NAME(glSecondaryColor3bvEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3DEXTPROC GLH_EXT_NAME(glSecondaryColor3dEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3DVEXTPROC GLH_EXT_NAME(glSecondaryColor3dvEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3FEXTPROC GLH_EXT_NAME(glSecondaryColor3fEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3FVEXTPROC GLH_EXT_NAME(glSecondaryColor3fvEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3IEXTPROC GLH_EXT_NAME(glSecondaryColor3iEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3IVEXTPROC GLH_EXT_NAME(glSecondaryColor3ivEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3SEXTPROC GLH_EXT_NAME(glSecondaryColor3sEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3SVEXTPROC GLH_EXT_NAME(glSecondaryColor3svEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3UBEXTPROC GLH_EXT_NAME(glSecondaryColor3ubEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3UBVEXTPROC GLH_EXT_NAME(glSecondaryColor3ubvEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3UIEXTPROC GLH_EXT_NAME(glSecondaryColor3uiEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3UIVEXTPROC GLH_EXT_NAME(glSecondaryColor3uivEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3USEXTPROC GLH_EXT_NAME(glSecondaryColor3usEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLOR3USVEXTPROC GLH_EXT_NAME(glSecondaryColor3usvEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLSECONDARYCOLORPOINTEREXTPROC GLH_EXT_NAME(glSecondaryColorPointerEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_separate_specular_color -#endif - -#ifdef GL_EXT_shared_texture_palette -#endif - -#ifdef GL_EXT_stencil_wrap -#endif - -#ifdef GL_EXT_texture_compression_s3tc -#endif - -#ifdef GL_EXT_texture_cube_map -#endif - -#ifdef GL_EXT_texture_edge_clamp -#endif - -#ifdef GL_EXT_texture_env_add -#endif - -#ifdef GL_EXT_texture_env_combine -#endif - -#ifdef GL_EXT_texture_filter_anisotropic -#endif - -#ifdef GL_EXT_texture_lod_bias -#endif - -#ifdef GL_EXT_texture_object - GLH_EXTERN PFNGLARETEXTURESRESIDENTEXTPROC GLH_EXT_NAME(glAreTexturesResidentEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLBINDTEXTUREEXTPROC GLH_EXT_NAME(glBindTextureEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLDELETETEXTURESEXTPROC GLH_EXT_NAME(glDeleteTexturesEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLGENTEXTURESEXTPROC GLH_EXT_NAME(glGenTexturesEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLISTEXTUREEXTPROC GLH_EXT_NAME(glIsTextureEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLPRIORITIZETEXTURESEXTPROC GLH_EXT_NAME(glPrioritizeTexturesEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_texture3D - GLH_EXTERN PFNGLTEXIMAGE3DEXTPROC GLH_EXT_NAME(glTexImage3DEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_vertex_array - GLH_EXTERN PFNGLARRAYELEMENTEXTPROC GLH_EXT_NAME(glArrayElementEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOLORPOINTEREXTPROC GLH_EXT_NAME(glColorPointerEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLEDGEFLAGPOINTEREXTPROC GLH_EXT_NAME(glEdgeFlagPointerEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPOINTERVEXTPROC GLH_EXT_NAME(glGetPointervEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLINDEXPOINTEREXTPROC GLH_EXT_NAME(glIndexPointerEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLNORMALPOINTEREXTPROC GLH_EXT_NAME(glNormalPointerEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLTEXCOORDPOINTEREXTPROC GLH_EXT_NAME(glTexCoordPointerEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXPOINTEREXTPROC GLH_EXT_NAME(glVertexPointerEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLDRAWARRAYSEXTPROC GLH_EXT_NAME(glDrawArraysEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_EXT_vertex_weighting - GLH_EXTERN PFNGLVERTEXWEIGHTFEXTPROC GLH_EXT_NAME(glVertexWeightfEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXWEIGHTFVEXTPROC GLH_EXT_NAME(glVertexWeightfvEXT) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXWEIGHTPOINTEREXTPROC GLH_EXT_NAME(glVertexWeightPointerEXT) GLH_INITIALIZER; -#endif - -#ifdef GL_NV_blend_square -#endif - -#ifdef GL_NV_evaluators - GLH_EXTERN PFNGLMAPCONTROLPOINTSNVPROC GLH_EXT_NAME(glMapControlPointsNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLMAPPARAMETERIVNVPROC GLH_EXT_NAME(glMapParameterivNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLMAPPARAMETERFVNVPROC GLH_EXT_NAME(glMapParameterfvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETMAPCONTROLPOINTSNVPROC GLH_EXT_NAME(glGetMapControlPointsNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETMAPPARAMETERIVNVPROC GLH_EXT_NAME(glGetMapParameterivNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETMAPPARAMETERFVNVPROC GLH_EXT_NAME(glGetMapParameterfvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETMAPATTRIBPARAMETERIVNVPROC GLH_EXT_NAME(glGetMapAttribParameterivNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETMAPATTRIBPARAMETERFVNVPROC GLH_EXT_NAME(glGetMapAttribParameterfvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLEVALMAPSNVPROC GLH_EXT_NAME(glEvalMapsNV) GLH_INITIALIZER; -#endif - -#ifdef GL_NV_fence - GLH_EXTERN PFNGLGENFENCESNVPROC GLH_EXT_NAME(glGenFencesNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLDELETEFENCESNVPROC GLH_EXT_NAME(glDeleteFencesNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLSETFENCENVPROC GLH_EXT_NAME(glSetFenceNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLTESTFENCENVPROC GLH_EXT_NAME(glTestFenceNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLFINISHFENCENVPROC GLH_EXT_NAME(glFinishFenceNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLISFENCENVPROC GLH_EXT_NAME(glIsFenceNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETFENCEIVNVPROC GLH_EXT_NAME(glGetFenceivNV) GLH_INITIALIZER; -#endif - -#ifdef GL_NV_fog_distance -#endif - -#ifdef GL_NV_packed_depth_stencil -#endif - -#ifdef GL_NV_register_combiners - GLH_EXTERN PFNGLCOMBINERPARAMETERFVNVPROC GLH_EXT_NAME(glCombinerParameterfvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMBINERPARAMETERFNVPROC GLH_EXT_NAME(glCombinerParameterfNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMBINERPARAMETERIVNVPROC GLH_EXT_NAME(glCombinerParameterivNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMBINERPARAMETERINVPROC GLH_EXT_NAME(glCombinerParameteriNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMBINERINPUTNVPROC GLH_EXT_NAME(glCombinerInputNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOMBINEROUTPUTNVPROC GLH_EXT_NAME(glCombinerOutputNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLFINALCOMBINERINPUTNVPROC GLH_EXT_NAME(glFinalCombinerInputNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC GLH_EXT_NAME(glGetCombinerInputParameterfvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC GLH_EXT_NAME(glGetCombinerInputParameterivNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC GLH_EXT_NAME(glGetCombinerOutputParameterfvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC GLH_EXT_NAME(glGetCombinerOutputParameterivNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC GLH_EXT_NAME(glGetFinalCombinerInputParameterfvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC GLH_EXT_NAME(glGetFinalCombinerInputParameterivNV) GLH_INITIALIZER; -#endif - -#ifdef GL_NV_register_combiners2 - GLH_EXTERN PFNGLCOMBINERSTAGEPARAMETERFVNVPROC GLH_EXT_NAME(glCombinerStageParameterfvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC GLH_EXT_NAME(glGetCombinerStageParameterfvNV) GLH_INITIALIZER; -#endif - -#ifdef GL_NV_texgen_reflection -#endif - -#ifdef GL_NV_texture_env_combine4 -#endif - -#ifdef GL_NV_texture_rectangle -#endif - -#ifdef GL_NV_texture_shader -#endif - -#ifdef GL_NV_vertex_array_range - GLH_EXTERN PFNGLFLUSHVERTEXARRAYRANGENVPROC GLH_EXT_NAME(glFlushVertexArrayRangeNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXARRAYRANGENVPROC GLH_EXT_NAME(glVertexArrayRangeNV) GLH_INITIALIZER; -# ifdef _WIN32 - GLH_EXTERN PFNWGLALLOCATEMEMORYNVPROC GLH_EXT_NAME(wglAllocateMemoryNV) GLH_INITIALIZER; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXTERN PFNGLXALLOCATEMEMORYNVPROC GLH_EXT_NAME(glXAllocateMemoryNV) GLH_INITIALIZER; -# endif -# ifdef _WIN32 - GLH_EXTERN PFNWGLFREEMEMORYNVPROC GLH_EXT_NAME(wglFreeMemoryNV) GLH_INITIALIZER; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXTERN PFNGLXFREEMEMORYNVPROC GLH_EXT_NAME(glXFreeMemoryNV) GLH_INITIALIZER; -# endif -#endif - -#ifdef GL_NV_vertex_program - GLH_EXTERN PFNGLAREPROGRAMSRESIDENTNVPROC GLH_EXT_NAME(glAreProgramsResidentNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLBINDPROGRAMNVPROC GLH_EXT_NAME(glBindProgramNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLDELETEPROGRAMSNVPROC GLH_EXT_NAME(glDeleteProgramsNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLEXECUTEPROGRAMNVPROC GLH_EXT_NAME(glExecuteProgramNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGENPROGRAMSNVPROC GLH_EXT_NAME(glGenProgramsNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPROGRAMPARAMETERDVNVPROC GLH_EXT_NAME(glGetProgramParameterdvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPROGRAMPARAMETERFVNVPROC GLH_EXT_NAME(glGetProgramParameterfvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPROGRAMIVNVPROC GLH_EXT_NAME(glGetProgramivNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETPROGRAMSTRINGNVPROC GLH_EXT_NAME(glGetProgramStringNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETTRACKMATRIXIVNVPROC GLH_EXT_NAME(glGetTrackMatrixivNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETVERTEXATTRIBDVNVPROC GLH_EXT_NAME(glGetVertexAttribdvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETVERTEXATTRIBFVNVPROC GLH_EXT_NAME(glGetVertexAttribfvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETVERTEXATTRIBIVNVPROC GLH_EXT_NAME(glGetVertexAttribivNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETVERTEXATTRIBPOINTERVNVPROC GLH_EXT_NAME(glGetVertexAttribPointervNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLISPROGRAMNVPROC GLH_EXT_NAME(glIsProgramNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLLOADPROGRAMNVPROC GLH_EXT_NAME(glLoadProgramNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMPARAMETER4DNVPROC GLH_EXT_NAME(glProgramParameter4dNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMPARAMETER4DVNVPROC GLH_EXT_NAME(glProgramParameter4dvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMPARAMETER4FNVPROC GLH_EXT_NAME(glProgramParameter4fNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMPARAMETER4FVNVPROC GLH_EXT_NAME(glProgramParameter4fvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMPARAMETERS4DVNVPROC GLH_EXT_NAME(glProgramParameters4dvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLPROGRAMPARAMETERS4FVNVPROC GLH_EXT_NAME(glProgramParameters4fvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLREQUESTRESIDENTPROGRAMSNVPROC GLH_EXT_NAME(glRequestResidentProgramsNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLTRACKMATRIXNVPROC GLH_EXT_NAME(glTrackMatrixNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBPOINTERNVPROC GLH_EXT_NAME(glVertexAttribPointerNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1DNVPROC GLH_EXT_NAME(glVertexAttrib1dNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1DVNVPROC GLH_EXT_NAME(glVertexAttrib1dvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1FNVPROC GLH_EXT_NAME(glVertexAttrib1fNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1FVNVPROC GLH_EXT_NAME(glVertexAttrib1fvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1SNVPROC GLH_EXT_NAME(glVertexAttrib1sNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB1SVNVPROC GLH_EXT_NAME(glVertexAttrib1svNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2DNVPROC GLH_EXT_NAME(glVertexAttrib2dNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2DVNVPROC GLH_EXT_NAME(glVertexAttrib2dvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2FNVPROC GLH_EXT_NAME(glVertexAttrib2fNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2FVNVPROC GLH_EXT_NAME(glVertexAttrib2fvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2SNVPROC GLH_EXT_NAME(glVertexAttrib2sNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB2SVNVPROC GLH_EXT_NAME(glVertexAttrib2svNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3DNVPROC GLH_EXT_NAME(glVertexAttrib3dNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3DVNVPROC GLH_EXT_NAME(glVertexAttrib3dvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3FNVPROC GLH_EXT_NAME(glVertexAttrib3fNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3FVNVPROC GLH_EXT_NAME(glVertexAttrib3fvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3SNVPROC GLH_EXT_NAME(glVertexAttrib3sNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB3SVNVPROC GLH_EXT_NAME(glVertexAttrib3svNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4DNVPROC GLH_EXT_NAME(glVertexAttrib4dNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4DVNVPROC GLH_EXT_NAME(glVertexAttrib4dvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4FNVPROC GLH_EXT_NAME(glVertexAttrib4fNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4FVNVPROC GLH_EXT_NAME(glVertexAttrib4fvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4SNVPROC GLH_EXT_NAME(glVertexAttrib4sNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4SVNVPROC GLH_EXT_NAME(glVertexAttrib4svNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIB4UBVNVPROC GLH_EXT_NAME(glVertexAttrib4ubvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS1DVNVPROC GLH_EXT_NAME(glVertexAttribs1dvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS1FVNVPROC GLH_EXT_NAME(glVertexAttribs1fvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS1SVNVPROC GLH_EXT_NAME(glVertexAttribs1svNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS2DVNVPROC GLH_EXT_NAME(glVertexAttribs2dvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS2FVNVPROC GLH_EXT_NAME(glVertexAttribs2fvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS2SVNVPROC GLH_EXT_NAME(glVertexAttribs2svNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS3DVNVPROC GLH_EXT_NAME(glVertexAttribs3dvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS3FVNVPROC GLH_EXT_NAME(glVertexAttribs3fvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS3SVNVPROC GLH_EXT_NAME(glVertexAttribs3svNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS4DVNVPROC GLH_EXT_NAME(glVertexAttribs4dvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS4FVNVPROC GLH_EXT_NAME(glVertexAttribs4fvNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS4SVNVPROC GLH_EXT_NAME(glVertexAttribs4svNV) GLH_INITIALIZER; - GLH_EXTERN PFNGLVERTEXATTRIBS4UBVNVPROC GLH_EXT_NAME(glVertexAttribs4ubvNV) GLH_INITIALIZER; -#endif - -#ifdef GL_SGIS_generate_mipmap -#endif - -#ifdef GL_SGIS_texture_lod -#endif - -#ifdef GL_SGIX_depth_texture -#endif - -#ifdef GL_SGIX_shadow -#endif - -#ifdef GL_VERSION_1_2 - /* These routines are prefixed by the preprocessor constant - GLH_CORE_1_2_PREFIX to avoid colliding with the OpenGL 1.2 namespace. */ - GLH_EXTERN PFNGLBLENDCOLORPROC GLH_CORE_1_2_NAME(glBlendColor) GLH_INITIALIZER; - GLH_EXTERN PFNGLBLENDEQUATIONPROC GLH_CORE_1_2_NAME(glBlendEquation) GLH_INITIALIZER; - GLH_EXTERN PFNGLDRAWRANGEELEMENTSPROC GLH_CORE_1_2_NAME(glDrawRangeElements) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOLORTABLEPROC GLH_CORE_1_2_NAME(glColorTable) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOLORTABLEPARAMETERFVPROC GLH_CORE_1_2_NAME(glColorTableParameterfv) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOLORTABLEPARAMETERIVPROC GLH_CORE_1_2_NAME(glColorTableParameteriv) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOPYCOLORTABLEPROC GLH_CORE_1_2_NAME(glCopyColorTable) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETCOLORTABLEPROC GLH_CORE_1_2_NAME(glGetColorTable) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETCOLORTABLEPARAMETERFVPROC GLH_CORE_1_2_NAME(glGetColorTableParameterfv) GLH_INITIALIZER; - GLH_EXTERN PFNGLGETCOLORTABLEPARAMETERIVPROC GLH_CORE_1_2_NAME(glGetColorTableParameteriv) GLH_INITIALIZER; - GLH_EXTERN PFNGLTEXIMAGE3DPROC GLH_CORE_1_2_NAME(glTexImage3D) GLH_INITIALIZER; - GLH_EXTERN PFNGLTEXSUBIMAGE3DPROC GLH_CORE_1_2_NAME(glTexSubImage3D) GLH_INITIALIZER; - GLH_EXTERN PFNGLCOPYTEXSUBIMAGE3DPROC GLH_CORE_1_2_NAME(glCopyTexSubImage3D) GLH_INITIALIZER; -#endif - -#ifdef GL_WIN_swap_hint - GLH_EXTERN PFNGLADDSWAPHINTRECTWINPROC GLH_EXT_NAME(glAddSwapHintRectWIN) GLH_INITIALIZER; -#endif - -#ifdef WGL_ARB_pbuffer -# ifdef _WIN32 - GLH_EXTERN PFNWGLCREATEPBUFFERARBPROC GLH_EXT_NAME(wglCreatePbufferARB) GLH_INITIALIZER; -# endif -# ifdef _WIN32 - GLH_EXTERN PFNWGLGETPBUFFERDCARBPROC GLH_EXT_NAME(wglGetPbufferDCARB) GLH_INITIALIZER; -# endif -# ifdef _WIN32 - GLH_EXTERN PFNWGLRELEASEPBUFFERDCARBPROC GLH_EXT_NAME(wglReleasePbufferDCARB) GLH_INITIALIZER; -# endif -# ifdef _WIN32 - GLH_EXTERN PFNWGLDESTROYPBUFFERARBPROC GLH_EXT_NAME(wglDestroyPbufferARB) GLH_INITIALIZER; -# endif -# ifdef _WIN32 - GLH_EXTERN PFNWGLQUERYPBUFFERARBPROC GLH_EXT_NAME(wglQueryPbufferARB) GLH_INITIALIZER; -# endif -#endif - -#ifdef WGL_ARB_render_texture -# ifdef _WIN32 - GLH_EXTERN PFNWGLBINDTEXIMAGEARBPROC GLH_EXT_NAME(wglBindTexImageARB) GLH_INITIALIZER; -# endif -# ifdef _WIN32 - GLH_EXTERN PFNWGLRELEASETEXIMAGEARBPROC GLH_EXT_NAME(wglReleaseTexImageARB) GLH_INITIALIZER; -# endif -# ifdef _WIN32 - GLH_EXTERN PFNWGLSETPBUFFERATTRIBARBPROC GLH_EXT_NAME(wglSetPbufferAttribARB) GLH_INITIALIZER; -# endif -#endif - -#ifdef WGL_ARB_pixel_format -# ifdef _WIN32 - GLH_EXTERN PFNWGLGETPIXELFORMATATTRIBIVARBPROC GLH_EXT_NAME(wglGetPixelFormatAttribivARB) GLH_INITIALIZER; -# endif -# ifdef _WIN32 - GLH_EXTERN PFNWGLGETPIXELFORMATATTRIBFVARBPROC GLH_EXT_NAME(wglGetPixelFormatAttribfvARB) GLH_INITIALIZER; -# endif -# ifdef _WIN32 - GLH_EXTERN PFNWGLCHOOSEPIXELFORMATARBPROC GLH_EXT_NAME(wglChoosePixelFormatARB) GLH_INITIALIZER; -# endif -#endif - - -#ifdef GLH_EXT_SINGLE_FILE - -int glh_init_extension(const char* extension) -{ - if (NULL == extension) { - return FALSE; -#ifdef GL_ARB_multitexture - } else if (0 == strcmp(extension, "GL_ARB_multitexture")) { - GLH_EXT_NAME(glMultiTexCoord1dARB) = (PFNGLMULTITEXCOORD1DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1dARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord1dARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord1dvARB) = (PFNGLMULTITEXCOORD1DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1dvARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord1dvARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord1fARB) = (PFNGLMULTITEXCOORD1FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1fARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord1fARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord1fvARB) = (PFNGLMULTITEXCOORD1FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1fvARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord1fvARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord1iARB) = (PFNGLMULTITEXCOORD1IARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1iARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord1iARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord1ivARB) = (PFNGLMULTITEXCOORD1IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1ivARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord1ivARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord1sARB) = (PFNGLMULTITEXCOORD1SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1sARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord1sARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord1svARB) = (PFNGLMULTITEXCOORD1SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1svARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord1svARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord2dARB) = (PFNGLMULTITEXCOORD2DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2dARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord2dARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord2dvARB) = (PFNGLMULTITEXCOORD2DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2dvARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord2dvARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord2fARB) = (PFNGLMULTITEXCOORD2FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2fARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord2fARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord2fvARB) = (PFNGLMULTITEXCOORD2FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2fvARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord2fvARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord2iARB) = (PFNGLMULTITEXCOORD2IARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2iARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord2iARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord2ivARB) = (PFNGLMULTITEXCOORD2IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2ivARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord2ivARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord2sARB) = (PFNGLMULTITEXCOORD2SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2sARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord2sARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord2svARB) = (PFNGLMULTITEXCOORD2SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2svARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord2svARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord3dARB) = (PFNGLMULTITEXCOORD3DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3dARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord3dARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord3dvARB) = (PFNGLMULTITEXCOORD3DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3dvARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord3dvARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord3fARB) = (PFNGLMULTITEXCOORD3FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3fARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord3fARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord3fvARB) = (PFNGLMULTITEXCOORD3FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3fvARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord3fvARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord3iARB) = (PFNGLMULTITEXCOORD3IARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3iARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord3iARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord3ivARB) = (PFNGLMULTITEXCOORD3IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3ivARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord3ivARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord3sARB) = (PFNGLMULTITEXCOORD3SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3sARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord3sARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord3svARB) = (PFNGLMULTITEXCOORD3SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3svARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord3svARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord4dARB) = (PFNGLMULTITEXCOORD4DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4dARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord4dARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord4dvARB) = (PFNGLMULTITEXCOORD4DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4dvARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord4dvARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord4fARB) = (PFNGLMULTITEXCOORD4FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4fARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord4fARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord4fvARB) = (PFNGLMULTITEXCOORD4FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4fvARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord4fvARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord4iARB) = (PFNGLMULTITEXCOORD4IARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4iARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord4iARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord4ivARB) = (PFNGLMULTITEXCOORD4IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4ivARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord4ivARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord4sARB) = (PFNGLMULTITEXCOORD4SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4sARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord4sARB)) - return FALSE; - GLH_EXT_NAME(glMultiTexCoord4svARB) = (PFNGLMULTITEXCOORD4SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4svARB"); - if (NULL == GLH_EXT_NAME(glMultiTexCoord4svARB)) - return FALSE; - GLH_EXT_NAME(glActiveTextureARB) = (PFNGLACTIVETEXTUREARBPROC)GLH_EXT_GET_PROC_ADDRESS("glActiveTextureARB"); - if (NULL == GLH_EXT_NAME(glActiveTextureARB)) - return FALSE; - GLH_EXT_NAME(glClientActiveTextureARB) = (PFNGLCLIENTACTIVETEXTUREARBPROC)GLH_EXT_GET_PROC_ADDRESS("glClientActiveTextureARB"); - if (NULL == GLH_EXT_NAME(glClientActiveTextureARB)) - return FALSE; -#endif - -#ifdef GL_ARB_texture_border_clamp - } else if (0 == strcmp(extension, "GL_ARB_texture_border_clamp")) { -#endif - -#ifdef GL_ARB_texture_compression - } else if (0 == strcmp(extension, "GL_ARB_texture_compression")) { - GLH_EXT_NAME(glCompressedTexImage3DARB) = (PFNGLCOMPRESSEDTEXIMAGE3DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexImage3DARB"); - if (NULL == GLH_EXT_NAME(glCompressedTexImage3DARB)) - return FALSE; - GLH_EXT_NAME(glCompressedTexImage2DARB) = (PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexImage2DARB"); - if (NULL == GLH_EXT_NAME(glCompressedTexImage2DARB)) - return FALSE; - GLH_EXT_NAME(glCompressedTexImage1DARB) = (PFNGLCOMPRESSEDTEXIMAGE1DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexImage1DARB"); - if (NULL == GLH_EXT_NAME(glCompressedTexImage1DARB)) - return FALSE; - GLH_EXT_NAME(glCompressedTexSubImage3DARB) = (PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexSubImage3DARB"); - if (NULL == GLH_EXT_NAME(glCompressedTexSubImage3DARB)) - return FALSE; - GLH_EXT_NAME(glCompressedTexSubImage2DARB) = (PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexSubImage2DARB"); - if (NULL == GLH_EXT_NAME(glCompressedTexSubImage2DARB)) - return FALSE; - GLH_EXT_NAME(glCompressedTexSubImage1DARB) = (PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexSubImage1DARB"); - if (NULL == GLH_EXT_NAME(glCompressedTexSubImage1DARB)) - return FALSE; - GLH_EXT_NAME(glGetCompressedTexImageARB) = (PFNGLGETCOMPRESSEDTEXIMAGEARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetCompressedTexImageARB"); - if (NULL == GLH_EXT_NAME(glGetCompressedTexImageARB)) - return FALSE; -#endif - -#ifdef GL_ARB_texture_cube_map - } else if (0 == strcmp(extension, "GL_ARB_texture_cube_map")) { -#endif - -#ifdef GL_ARB_transpose_matrix - } else if (0 == strcmp(extension, "GL_ARB_transpose_matrix")) { - GLH_EXT_NAME(glLoadTransposeMatrixfARB) = (PFNGLLOADTRANSPOSEMATRIXFARBPROC)GLH_EXT_GET_PROC_ADDRESS("glLoadTransposeMatrixfARB"); - if (NULL == GLH_EXT_NAME(glLoadTransposeMatrixfARB)) - return FALSE; - GLH_EXT_NAME(glLoadTransposeMatrixdARB) = (PFNGLLOADTRANSPOSEMATRIXDARBPROC)GLH_EXT_GET_PROC_ADDRESS("glLoadTransposeMatrixdARB"); - if (NULL == GLH_EXT_NAME(glLoadTransposeMatrixdARB)) - return FALSE; - GLH_EXT_NAME(glMultTransposeMatrixfARB) = (PFNGLMULTTRANSPOSEMATRIXFARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultTransposeMatrixfARB"); - if (NULL == GLH_EXT_NAME(glMultTransposeMatrixfARB)) - return FALSE; - GLH_EXT_NAME(glMultTransposeMatrixdARB) = (PFNGLMULTTRANSPOSEMATRIXDARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultTransposeMatrixdARB"); - if (NULL == GLH_EXT_NAME(glMultTransposeMatrixdARB)) - return FALSE; -#endif - -#ifdef GL_ARB_vertex_program - } else if (0 == strcmp(extension, "GL_ARB_vertex_program")) { - GLH_EXT_NAME(glVertexAttrib1sARB) = (PFNGLVERTEXATTRIB1SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1sARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1sARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib1fARB) = (PFNGLVERTEXATTRIB1FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1fARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1fARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib1dARB) = (PFNGLVERTEXATTRIB1DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1dARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1dARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib2sARB) = (PFNGLVERTEXATTRIB2SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2sARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2sARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib2fARB) = (PFNGLVERTEXATTRIB2FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2fARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2fARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib2dARB) = (PFNGLVERTEXATTRIB2DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2dARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2dARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib3sARB) = (PFNGLVERTEXATTRIB3SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3sARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3sARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib3fARB) = (PFNGLVERTEXATTRIB3FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3fARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3fARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib3dARB) = (PFNGLVERTEXATTRIB3DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3dARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3dARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4sARB) = (PFNGLVERTEXATTRIB4SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4sARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4sARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4fARB) = (PFNGLVERTEXATTRIB4FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4fARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4fARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4dARB) = (PFNGLVERTEXATTRIB4DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4dARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4dARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4NubARB) = (PFNGLVERTEXATTRIB4NUBARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4NubARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4NubARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib1svARB) = (PFNGLVERTEXATTRIB1SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1svARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1svARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib1fvARB) = (PFNGLVERTEXATTRIB1FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1fvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib1dvARB) = (PFNGLVERTEXATTRIB1DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1dvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1dvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib2svARB) = (PFNGLVERTEXATTRIB2SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2svARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2svARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib2fvARB) = (PFNGLVERTEXATTRIB2FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2fvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib2dvARB) = (PFNGLVERTEXATTRIB2DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2dvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2dvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib3svARB) = (PFNGLVERTEXATTRIB3SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3svARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3svARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib3fvARB) = (PFNGLVERTEXATTRIB3FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3fvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib3dvARB) = (PFNGLVERTEXATTRIB3DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3dvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3dvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4bvARB) = (PFNGLVERTEXATTRIB4BVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4bvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4bvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4svARB) = (PFNGLVERTEXATTRIB4SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4svARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4svARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4ivARB) = (PFNGLVERTEXATTRIB4IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4ivARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4ivARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4ubvARB) = (PFNGLVERTEXATTRIB4UBVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4ubvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4ubvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4usvARB) = (PFNGLVERTEXATTRIB4USVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4usvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4usvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4uivARB) = (PFNGLVERTEXATTRIB4UIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4uivARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4uivARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4fvARB) = (PFNGLVERTEXATTRIB4FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4fvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4dvARB) = (PFNGLVERTEXATTRIB4DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4dvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4dvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4NbvARB) = (PFNGLVERTEXATTRIB4NBVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4NbvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4NbvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4NsvARB) = (PFNGLVERTEXATTRIB4NSVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4NsvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4NsvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4NivARB) = (PFNGLVERTEXATTRIB4NIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4NivARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4NivARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4NubvARB) = (PFNGLVERTEXATTRIB4NUBVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4NubvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4NubvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4NusvARB) = (PFNGLVERTEXATTRIB4NUSVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4NusvARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4NusvARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttrib4NuivARB) = (PFNGLVERTEXATTRIB4NUIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4NuivARB"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4NuivARB)) - return GL_FALSE; - GLH_EXT_NAME(glVertexAttribPointerARB) = (PFNGLVERTEXATTRIBPOINTERARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribPointerARB"); - if (NULL == GLH_EXT_NAME(glVertexAttribPointerARB)) - return GL_FALSE; - GLH_EXT_NAME(glEnableVertexAttribArrayARB) = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)GLH_EXT_GET_PROC_ADDRESS("glEnableVertexAttribArrayARB"); - if (NULL == GLH_EXT_NAME(glEnableVertexAttribArrayARB)) - return GL_FALSE; - GLH_EXT_NAME(glDisableVertexAttribArrayARB) = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)GLH_EXT_GET_PROC_ADDRESS("glDisableVertexAttribArrayARB"); - if (NULL == GLH_EXT_NAME(glDisableVertexAttribArrayARB)) - return GL_FALSE; - GLH_EXT_NAME(glProgramStringARB) = (PFNGLPROGRAMSTRINGARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramStringARB"); - if (NULL == GLH_EXT_NAME(glProgramStringARB)) - return GL_FALSE; - GLH_EXT_NAME(glBindProgramARB) = (PFNGLBINDPROGRAMARBPROC)GLH_EXT_GET_PROC_ADDRESS("glBindProgramARB"); - if (NULL == GLH_EXT_NAME(glBindProgramARB)) - return GL_FALSE; - GLH_EXT_NAME(glDeleteProgramsARB) = (PFNGLDELETEPROGRAMSARBPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteProgramsARB"); - if (NULL == GLH_EXT_NAME(glDeleteProgramsARB)) - return GL_FALSE; - GLH_EXT_NAME(glGenProgramsARB) = (PFNGLGENPROGRAMSARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGenProgramsARB"); - if (NULL == GLH_EXT_NAME(glGenProgramsARB)) - return GL_FALSE; - GLH_EXT_NAME(glProgramEnvParameter4dARB) = (PFNGLPROGRAMENVPARAMETER4DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramEnvParameter4dARB"); - if (NULL == GLH_EXT_NAME(glProgramEnvParameter4dARB)) - return GL_FALSE; - GLH_EXT_NAME(glProgramEnvParameter4dvARB) = (PFNGLPROGRAMENVPARAMETER4DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramEnvParameter4dvARB"); - if (NULL == GLH_EXT_NAME(glProgramEnvParameter4dvARB)) - return GL_FALSE; - GLH_EXT_NAME(glProgramEnvParameter4fARB) = (PFNGLPROGRAMENVPARAMETER4FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramEnvParameter4fARB"); - if (NULL == GLH_EXT_NAME(glProgramEnvParameter4fARB)) - return GL_FALSE; - GLH_EXT_NAME(glProgramEnvParameter4fvARB) = (PFNGLPROGRAMENVPARAMETER4FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramEnvParameter4fvARB"); - if (NULL == GLH_EXT_NAME(glProgramEnvParameter4fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glProgramLocalParameter4dARB) = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramLocalParameter4dARB"); - if (NULL == GLH_EXT_NAME(glProgramLocalParameter4dARB)) - return GL_FALSE; - GLH_EXT_NAME(glProgramLocalParameter4dvARB) = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramLocalParameter4dvARB"); - if (NULL == GLH_EXT_NAME(glProgramLocalParameter4dvARB)) - return GL_FALSE; - GLH_EXT_NAME(glProgramLocalParameter4fARB) = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramLocalParameter4fARB"); - if (NULL == GLH_EXT_NAME(glProgramLocalParameter4fARB)) - return GL_FALSE; - GLH_EXT_NAME(glProgramLocalParameter4fvARB) = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramLocalParameter4fvARB"); - if (NULL == GLH_EXT_NAME(glProgramLocalParameter4fvARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetProgramEnvParameterdvARB) = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramEnvParameterdvARB"); - if (NULL == GLH_EXT_NAME(glGetProgramEnvParameterdvARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetProgramEnvParameterfvARB) = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramEnvParameterfvARB"); - if (NULL == GLH_EXT_NAME(glGetProgramEnvParameterfvARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetProgramLocalParameterdvARB) = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramLocalParameterdvARB"); - if (NULL == GLH_EXT_NAME(glGetProgramLocalParameterdvARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetProgramLocalParameterfvARB) = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramLocalParameterfvARB"); - if (NULL == GLH_EXT_NAME(glGetProgramLocalParameterfvARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetProgramivARB) = (PFNGLGETPROGRAMIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramivARB"); - if (NULL == GLH_EXT_NAME(glGetProgramivARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetProgramStringARB) = (PFNGLGETPROGRAMSTRINGARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramStringARB"); - if (NULL == GLH_EXT_NAME(glGetProgramStringARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetVertexAttribdvARB) = (PFNGLGETVERTEXATTRIBDVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribdvARB"); - if (NULL == GLH_EXT_NAME(glGetVertexAttribdvARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetVertexAttribfvARB) = (PFNGLGETVERTEXATTRIBFVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribfvARB"); - if (NULL == GLH_EXT_NAME(glGetVertexAttribfvARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetVertexAttribivARB) = (PFNGLGETVERTEXATTRIBIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribivARB"); - if (NULL == GLH_EXT_NAME(glGetVertexAttribivARB)) - return GL_FALSE; - GLH_EXT_NAME(glGetVertexAttribPointervARB) = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribPointervARB"); - if (NULL == GLH_EXT_NAME(glGetVertexAttribPointervARB)) - return GL_FALSE; - GLH_EXT_NAME(glIsProgramARB) = (PFNGLISPROGRAMARBPROC)GLH_EXT_GET_PROC_ADDRESS("glIsProgramARB"); - if (NULL == GLH_EXT_NAME(glIsProgramARB)) - return GL_FALSE; -#endif - -#ifdef GL_EXT_abgr - } else if (0 == strcmp(extension, "GL_EXT_abgr")) { -#endif - -#ifdef GL_EXT_bgra - } else if (0 == strcmp(extension, "GL_EXT_bgra")) { -#endif - -#ifdef GL_EXT_blend_color - } else if (0 == strcmp(extension, "GL_EXT_blend_color")) { - GLH_EXT_NAME(glBlendColorEXT) = (PFNGLBLENDCOLOREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendColorEXT"); - if (NULL == GLH_EXT_NAME(glBlendColorEXT)) - return FALSE; -#endif - -#ifdef GL_EXT_blend_minmax - } else if (0 == strcmp(extension, "GL_EXT_blend_minmax")) { - GLH_EXT_NAME(glBlendEquationEXT) = (PFNGLBLENDEQUATIONEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendEquationEXT"); - if (NULL == GLH_EXT_NAME(glBlendEquationEXT)) - return FALSE; -#endif - -#ifdef GL_EXT_blend_subtract - } else if (0 == strcmp(extension, "GL_EXT_blend_subtract")) { -#endif - -#ifdef GL_EXT_compiled_vertex_array - } else if (0 == strcmp(extension, "GL_EXT_compiled_vertex_array")) { - GLH_EXT_NAME(glLockArraysEXT) = (PFNGLLOCKARRAYSEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glLockArraysEXT"); - if (NULL == GLH_EXT_NAME(glLockArraysEXT)) - return FALSE; - GLH_EXT_NAME(glUnlockArraysEXT) = (PFNGLUNLOCKARRAYSEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glUnlockArraysEXT"); - if (NULL == GLH_EXT_NAME(glUnlockArraysEXT)) - return FALSE; -#endif - -#ifdef GL_EXT_fog_coord - } else if (0 == strcmp(extension, "GL_EXT_fog_coord")) { - GLH_EXT_NAME(glFogCoorddEXT) = (PFNGLFOGCOORDDEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glFogCoorddEXT"); - if (NULL == GLH_EXT_NAME(glFogCoorddEXT)) - return FALSE; - GLH_EXT_NAME(glFogCoorddvEXT) = (PFNGLFOGCOORDDVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glFogCoorddvEXT"); - if (NULL == GLH_EXT_NAME(glFogCoorddvEXT)) - return FALSE; - GLH_EXT_NAME(glFogCoordfEXT) = (PFNGLFOGCOORDFEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glFogCoordfEXT"); - if (NULL == GLH_EXT_NAME(glFogCoordfEXT)) - return FALSE; - GLH_EXT_NAME(glFogCoordfvEXT) = (PFNGLFOGCOORDFVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glFogCoordfvEXT"); - if (NULL == GLH_EXT_NAME(glFogCoordfvEXT)) - return FALSE; - GLH_EXT_NAME(glFogCoordPointerEXT) = (PFNGLFOGCOORDPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glFogCoordPointerEXT"); - if (NULL == GLH_EXT_NAME(glFogCoordPointerEXT)) - return FALSE; -#endif - -#ifdef GL_EXT_light_max_exponent - } else if (0 == strcmp(extension, "GL_EXT_light_max_exponent")) { -#endif - -#ifdef GL_EXT_packed_pixels - } else if (0 == strcmp(extension, "GL_EXT_packed_pixels")) { -#endif - -#ifdef GL_EXT_paletted_texture - } else if (0 == strcmp(extension, "GL_EXT_paletted_texture")) { - GLH_EXT_NAME(glColorSubTableEXT) = (PFNGLCOLORSUBTABLEEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glColorSubTableEXT"); - if (NULL == GLH_EXT_NAME(glColorSubTableEXT)) - return FALSE; - GLH_EXT_NAME(glColorTableEXT) = (PFNGLCOLORTABLEEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glColorTableEXT"); - if (NULL == GLH_EXT_NAME(glColorTableEXT)) - return FALSE; - GLH_EXT_NAME(glGetColorTableEXT) = (PFNGLGETCOLORTABLEEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glGetColorTableEXT"); - if (NULL == GLH_EXT_NAME(glGetColorTableEXT)) - return FALSE; - GLH_EXT_NAME(glGetColorTableParameterfvEXT) = (PFNGLGETCOLORTABLEPARAMETERFVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glGetColorTableParameterfvEXT"); - if (NULL == GLH_EXT_NAME(glGetColorTableParameterfvEXT)) - return FALSE; - GLH_EXT_NAME(glGetColorTableParameterivEXT) = (PFNGLGETCOLORTABLEPARAMETERIVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glGetColorTableParameterivEXT"); - if (NULL == GLH_EXT_NAME(glGetColorTableParameterivEXT)) - return FALSE; -#endif - -#ifdef GL_EXT_point_parameters - } else if (0 == strcmp(extension, "GL_EXT_point_parameters")) { - GLH_EXT_NAME(glPointParameterfEXT) = (PFNGLPOINTPARAMETERFEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterfEXT"); - if (NULL == GLH_EXT_NAME(glPointParameterfEXT)) - return FALSE; - GLH_EXT_NAME(glPointParameterfvEXT) = (PFNGLPOINTPARAMETERFVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterfvEXT"); - if (NULL == GLH_EXT_NAME(glPointParameterfvEXT)) - return FALSE; -#endif - -#ifdef GL_EXT_rescale_normal - } else if (0 == strcmp(extension, "GL_EXT_rescale_normal")) { -#endif - -#ifdef GL_EXT_secondary_color - } else if (0 == strcmp(extension, "GL_EXT_secondary_color")) { - GLH_EXT_NAME(glSecondaryColor3bEXT) = (PFNGLSECONDARYCOLOR3BEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3bEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3bEXT)) - return FALSE; - GLH_EXT_NAME(glSecondaryColor3bvEXT) = (PFNGLSECONDARYCOLOR3BVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3bvEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3bvEXT)) - return FALSE; - GLH_EXT_NAME(glSecondaryColor3dEXT) = (PFNGLSECONDARYCOLOR3DEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3dEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3dEXT)) - return FALSE; - GLH_EXT_NAME(glSecondaryColor3dvEXT) = (PFNGLSECONDARYCOLOR3DVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3dvEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3dvEXT)) - return FALSE; - GLH_EXT_NAME(glSecondaryColor3fEXT) = (PFNGLSECONDARYCOLOR3FEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3fEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3fEXT)) - return FALSE; - GLH_EXT_NAME(glSecondaryColor3fvEXT) = (PFNGLSECONDARYCOLOR3FVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3fvEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3fvEXT)) - return FALSE; - GLH_EXT_NAME(glSecondaryColor3iEXT) = (PFNGLSECONDARYCOLOR3IEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3iEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3iEXT)) - return FALSE; - GLH_EXT_NAME(glSecondaryColor3ivEXT) = (PFNGLSECONDARYCOLOR3IVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3ivEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3ivEXT)) - return FALSE; - GLH_EXT_NAME(glSecondaryColor3sEXT) = (PFNGLSECONDARYCOLOR3SEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3sEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3sEXT)) - return FALSE; - GLH_EXT_NAME(glSecondaryColor3svEXT) = (PFNGLSECONDARYCOLOR3SVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3svEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3svEXT)) - return FALSE; - GLH_EXT_NAME(glSecondaryColor3ubEXT) = (PFNGLSECONDARYCOLOR3UBEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3ubEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3ubEXT)) - return FALSE; - GLH_EXT_NAME(glSecondaryColor3ubvEXT) = (PFNGLSECONDARYCOLOR3UBVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3ubvEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3ubvEXT)) - return FALSE; - GLH_EXT_NAME(glSecondaryColor3uiEXT) = (PFNGLSECONDARYCOLOR3UIEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3uiEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3uiEXT)) - return FALSE; - GLH_EXT_NAME(glSecondaryColor3uivEXT) = (PFNGLSECONDARYCOLOR3UIVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3uivEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3uivEXT)) - return FALSE; - GLH_EXT_NAME(glSecondaryColor3usEXT) = (PFNGLSECONDARYCOLOR3USEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3usEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3usEXT)) - return FALSE; - GLH_EXT_NAME(glSecondaryColor3usvEXT) = (PFNGLSECONDARYCOLOR3USVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3usvEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColor3usvEXT)) - return FALSE; - GLH_EXT_NAME(glSecondaryColorPointerEXT) = (PFNGLSECONDARYCOLORPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColorPointerEXT"); - if (NULL == GLH_EXT_NAME(glSecondaryColorPointerEXT)) - return FALSE; -#endif - -#ifdef GL_EXT_separate_specular_color - } else if (0 == strcmp(extension, "GL_EXT_separate_specular_color")) { -#endif - -#ifdef GL_EXT_shared_texture_palette - } else if (0 == strcmp(extension, "GL_EXT_shared_texture_palette")) { -#endif - -#ifdef GL_EXT_stencil_wrap - } else if (0 == strcmp(extension, "GL_EXT_stencil_wrap")) { -#endif - -#ifdef GL_EXT_texture_compression_s3tc - } else if (0 == strcmp(extension, "GL_EXT_texture_compression_s3tc")) { -#endif - -#ifdef GL_EXT_texture_cube_map - } else if (0 == strcmp(extension, "GL_EXT_texture_cube_map")) { -#endif - -#ifdef GL_EXT_texture_edge_clamp - } else if (0 == strcmp(extension, "GL_EXT_texture_edge_clamp")) { -#endif - -#ifdef GL_EXT_texture_env_add - } else if (0 == strcmp(extension, "GL_EXT_texture_env_add")) { -#endif - -#ifdef GL_EXT_texture_env_combine - } else if (0 == strcmp(extension, "GL_EXT_texture_env_combine")) { -#endif - -#ifdef GL_EXT_texture_filter_anisotropic - } else if (0 == strcmp(extension, "GL_EXT_texture_filter_anisotropic")) { -#endif - -#ifdef GL_EXT_texture_lod_bias - } else if (0 == strcmp(extension, "GL_EXT_texture_lod_bias")) { -#endif - -#ifdef GL_EXT_texture_object - } else if (0 == strcmp(extension, "GL_EXT_texture_object")) { - GLH_EXT_NAME(glAreTexturesResidentEXT) = (PFNGLARETEXTURESRESIDENTEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glAreTexturesResidentEXT"); - if (NULL == GLH_EXT_NAME(glAreTexturesResidentEXT)) - return FALSE; - GLH_EXT_NAME(glBindTextureEXT) = (PFNGLBINDTEXTUREEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glBindTextureEXT"); - if (NULL == GLH_EXT_NAME(glBindTextureEXT)) - return FALSE; - GLH_EXT_NAME(glDeleteTexturesEXT) = (PFNGLDELETETEXTURESEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteTexturesEXT"); - if (NULL == GLH_EXT_NAME(glDeleteTexturesEXT)) - return FALSE; - GLH_EXT_NAME(glGenTexturesEXT) = (PFNGLGENTEXTURESEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glGenTexturesEXT"); - if (NULL == GLH_EXT_NAME(glGenTexturesEXT)) - return FALSE; - GLH_EXT_NAME(glIsTextureEXT) = (PFNGLISTEXTUREEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glIsTextureEXT"); - if (NULL == GLH_EXT_NAME(glIsTextureEXT)) - return FALSE; - GLH_EXT_NAME(glPrioritizeTexturesEXT) = (PFNGLPRIORITIZETEXTURESEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glPrioritizeTexturesEXT"); - if (NULL == GLH_EXT_NAME(glPrioritizeTexturesEXT)) - return FALSE; -#endif - -#ifdef GL_EXT_texture3D - } else if (0 == strcmp(extension, "GL_EXT_texture3D")) { - GLH_EXT_NAME(glTexImage3DEXT) = (PFNGLTEXIMAGE3DEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glTexImage3DEXT"); - if (NULL == GLH_EXT_NAME(glTexImage3DEXT)) - return FALSE; -#endif - -#ifdef GL_EXT_vertex_array - } else if (0 == strcmp(extension, "GL_EXT_vertex_array")) { - GLH_EXT_NAME(glArrayElementEXT) = (PFNGLARRAYELEMENTEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glArrayElementEXT"); - if (NULL == GLH_EXT_NAME(glArrayElementEXT)) - return FALSE; - GLH_EXT_NAME(glColorPointerEXT) = (PFNGLCOLORPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glColorPointerEXT"); - if (NULL == GLH_EXT_NAME(glColorPointerEXT)) - return FALSE; - GLH_EXT_NAME(glEdgeFlagPointerEXT) = (PFNGLEDGEFLAGPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glEdgeFlagPointerEXT"); - if (NULL == GLH_EXT_NAME(glEdgeFlagPointerEXT)) - return FALSE; - GLH_EXT_NAME(glGetPointervEXT) = (PFNGLGETPOINTERVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glGetPointervEXT"); - if (NULL == GLH_EXT_NAME(glGetPointervEXT)) - return FALSE; - GLH_EXT_NAME(glIndexPointerEXT) = (PFNGLINDEXPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glIndexPointerEXT"); - if (NULL == GLH_EXT_NAME(glIndexPointerEXT)) - return FALSE; - GLH_EXT_NAME(glNormalPointerEXT) = (PFNGLNORMALPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glNormalPointerEXT"); - if (NULL == GLH_EXT_NAME(glNormalPointerEXT)) - return FALSE; - GLH_EXT_NAME(glTexCoordPointerEXT) = (PFNGLTEXCOORDPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glTexCoordPointerEXT"); - if (NULL == GLH_EXT_NAME(glTexCoordPointerEXT)) - return FALSE; - GLH_EXT_NAME(glVertexPointerEXT) = (PFNGLVERTEXPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexPointerEXT"); - if (NULL == GLH_EXT_NAME(glVertexPointerEXT)) - return FALSE; - GLH_EXT_NAME(glDrawArraysEXT) = (PFNGLDRAWARRAYSEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glDrawArraysEXT"); - if (NULL == GLH_EXT_NAME(glDrawArraysEXT)) - return FALSE; -#endif - -#ifdef GL_EXT_vertex_weighting - } else if (0 == strcmp(extension, "GL_EXT_vertex_weighting")) { - GLH_EXT_NAME(glVertexWeightfEXT) = (PFNGLVERTEXWEIGHTFEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexWeightfEXT"); - if (NULL == GLH_EXT_NAME(glVertexWeightfEXT)) - return FALSE; - GLH_EXT_NAME(glVertexWeightfvEXT) = (PFNGLVERTEXWEIGHTFVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexWeightfvEXT"); - if (NULL == GLH_EXT_NAME(glVertexWeightfvEXT)) - return FALSE; - GLH_EXT_NAME(glVertexWeightPointerEXT) = (PFNGLVERTEXWEIGHTPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexWeightPointerEXT"); - if (NULL == GLH_EXT_NAME(glVertexWeightPointerEXT)) - return FALSE; -#endif - -#ifdef GL_NV_blend_square - } else if (0 == strcmp(extension, "GL_NV_blend_square")) { -#endif - -#ifdef GL_NV_evaluators - } else if (0 == strcmp(extension, "GL_NV_evaluators")) { - GLH_EXT_NAME(glMapControlPointsNV) = (PFNGLMAPCONTROLPOINTSNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMapControlPointsNV"); - if (NULL == GLH_EXT_NAME(glMapControlPointsNV)) - return FALSE; - GLH_EXT_NAME(glMapParameterivNV) = (PFNGLMAPPARAMETERIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMapParameterivNV"); - if (NULL == GLH_EXT_NAME(glMapParameterivNV)) - return FALSE; - GLH_EXT_NAME(glMapParameterfvNV) = (PFNGLMAPPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMapParameterfvNV"); - if (NULL == GLH_EXT_NAME(glMapParameterfvNV)) - return FALSE; - GLH_EXT_NAME(glGetMapControlPointsNV) = (PFNGLGETMAPCONTROLPOINTSNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetMapControlPointsNV"); - if (NULL == GLH_EXT_NAME(glGetMapControlPointsNV)) - return FALSE; - GLH_EXT_NAME(glGetMapParameterivNV) = (PFNGLGETMAPPARAMETERIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetMapParameterivNV"); - if (NULL == GLH_EXT_NAME(glGetMapParameterivNV)) - return FALSE; - GLH_EXT_NAME(glGetMapParameterfvNV) = (PFNGLGETMAPPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetMapParameterfvNV"); - if (NULL == GLH_EXT_NAME(glGetMapParameterfvNV)) - return FALSE; - GLH_EXT_NAME(glGetMapAttribParameterivNV) = (PFNGLGETMAPATTRIBPARAMETERIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetMapAttribParameterivNV"); - if (NULL == GLH_EXT_NAME(glGetMapAttribParameterivNV)) - return FALSE; - GLH_EXT_NAME(glGetMapAttribParameterfvNV) = (PFNGLGETMAPATTRIBPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetMapAttribParameterfvNV"); - if (NULL == GLH_EXT_NAME(glGetMapAttribParameterfvNV)) - return FALSE; - GLH_EXT_NAME(glEvalMapsNV) = (PFNGLEVALMAPSNVPROC)GLH_EXT_GET_PROC_ADDRESS("glEvalMapsNV"); - if (NULL == GLH_EXT_NAME(glEvalMapsNV)) - return FALSE; -#endif - -#ifdef GL_NV_fence - } else if (0 == strcmp(extension, "GL_NV_fence")) { - GLH_EXT_NAME(glGenFencesNV) = (PFNGLGENFENCESNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGenFencesNV"); - if (NULL == GLH_EXT_NAME(glGenFencesNV)) - return FALSE; - GLH_EXT_NAME(glDeleteFencesNV) = (PFNGLDELETEFENCESNVPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteFencesNV"); - if (NULL == GLH_EXT_NAME(glDeleteFencesNV)) - return FALSE; - GLH_EXT_NAME(glSetFenceNV) = (PFNGLSETFENCENVPROC)GLH_EXT_GET_PROC_ADDRESS("glSetFenceNV"); - if (NULL == GLH_EXT_NAME(glSetFenceNV)) - return FALSE; - GLH_EXT_NAME(glTestFenceNV) = (PFNGLTESTFENCENVPROC)GLH_EXT_GET_PROC_ADDRESS("glTestFenceNV"); - if (NULL == GLH_EXT_NAME(glTestFenceNV)) - return FALSE; - GLH_EXT_NAME(glFinishFenceNV) = (PFNGLFINISHFENCENVPROC)GLH_EXT_GET_PROC_ADDRESS("glFinishFenceNV"); - if (NULL == GLH_EXT_NAME(glFinishFenceNV)) - return FALSE; - GLH_EXT_NAME(glIsFenceNV) = (PFNGLISFENCENVPROC)GLH_EXT_GET_PROC_ADDRESS("glIsFenceNV"); - if (NULL == GLH_EXT_NAME(glIsFenceNV)) - return FALSE; - GLH_EXT_NAME(glGetFenceivNV) = (PFNGLGETFENCEIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetFenceivNV"); - if (NULL == GLH_EXT_NAME(glGetFenceivNV)) - return FALSE; -#endif - -#ifdef GL_NV_fog_distance - } else if (0 == strcmp(extension, "GL_NV_fog_distance")) { -#endif - -#ifdef GL_NV_packed_depth_stencil - } else if (0 == strcmp(extension, "GL_NV_packed_depth_stencil")) { -#endif - -#ifdef GL_NV_register_combiners - } else if (0 == strcmp(extension, "GL_NV_register_combiners")) { - GLH_EXT_NAME(glCombinerParameterfvNV) = (PFNGLCOMBINERPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glCombinerParameterfvNV"); - if (NULL == GLH_EXT_NAME(glCombinerParameterfvNV)) - return FALSE; - GLH_EXT_NAME(glCombinerParameterfNV) = (PFNGLCOMBINERPARAMETERFNVPROC)GLH_EXT_GET_PROC_ADDRESS("glCombinerParameterfNV"); - if (NULL == GLH_EXT_NAME(glCombinerParameterfNV)) - return FALSE; - GLH_EXT_NAME(glCombinerParameterivNV) = (PFNGLCOMBINERPARAMETERIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glCombinerParameterivNV"); - if (NULL == GLH_EXT_NAME(glCombinerParameterivNV)) - return FALSE; - GLH_EXT_NAME(glCombinerParameteriNV) = (PFNGLCOMBINERPARAMETERINVPROC)GLH_EXT_GET_PROC_ADDRESS("glCombinerParameteriNV"); - if (NULL == GLH_EXT_NAME(glCombinerParameteriNV)) - return FALSE; - GLH_EXT_NAME(glCombinerInputNV) = (PFNGLCOMBINERINPUTNVPROC)GLH_EXT_GET_PROC_ADDRESS("glCombinerInputNV"); - if (NULL == GLH_EXT_NAME(glCombinerInputNV)) - return FALSE; - GLH_EXT_NAME(glCombinerOutputNV) = (PFNGLCOMBINEROUTPUTNVPROC)GLH_EXT_GET_PROC_ADDRESS("glCombinerOutputNV"); - if (NULL == GLH_EXT_NAME(glCombinerOutputNV)) - return FALSE; - GLH_EXT_NAME(glFinalCombinerInputNV) = (PFNGLFINALCOMBINERINPUTNVPROC)GLH_EXT_GET_PROC_ADDRESS("glFinalCombinerInputNV"); - if (NULL == GLH_EXT_NAME(glFinalCombinerInputNV)) - return FALSE; - GLH_EXT_NAME(glGetCombinerInputParameterfvNV) = (PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetCombinerInputParameterfvNV"); - if (NULL == GLH_EXT_NAME(glGetCombinerInputParameterfvNV)) - return FALSE; - GLH_EXT_NAME(glGetCombinerInputParameterivNV) = (PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetCombinerInputParameterivNV"); - if (NULL == GLH_EXT_NAME(glGetCombinerInputParameterivNV)) - return FALSE; - GLH_EXT_NAME(glGetCombinerOutputParameterfvNV) = (PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetCombinerOutputParameterfvNV"); - if (NULL == GLH_EXT_NAME(glGetCombinerOutputParameterfvNV)) - return FALSE; - GLH_EXT_NAME(glGetCombinerOutputParameterivNV) = (PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetCombinerOutputParameterivNV"); - if (NULL == GLH_EXT_NAME(glGetCombinerOutputParameterivNV)) - return FALSE; - GLH_EXT_NAME(glGetFinalCombinerInputParameterfvNV) = (PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetFinalCombinerInputParameterfvNV"); - if (NULL == GLH_EXT_NAME(glGetFinalCombinerInputParameterfvNV)) - return FALSE; - GLH_EXT_NAME(glGetFinalCombinerInputParameterivNV) = (PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetFinalCombinerInputParameterivNV"); - if (NULL == GLH_EXT_NAME(glGetFinalCombinerInputParameterivNV)) - return FALSE; -#endif - -#ifdef GL_NV_register_combiners2 - } else if (0 == strcmp(extension, "GL_NV_register_combiners2")) { - GLH_EXT_NAME(glCombinerStageParameterfvNV) = (PFNGLCOMBINERSTAGEPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glCombinerStageParameterfvNV"); - if (NULL == GLH_EXT_NAME(glCombinerStageParameterfvNV)) - return FALSE; - GLH_EXT_NAME(glGetCombinerStageParameterfvNV) = (PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetCombinerStageParameterfvNV"); - if (NULL == GLH_EXT_NAME(glGetCombinerStageParameterfvNV)) - return FALSE; -#endif - -#ifdef GL_NV_texgen_reflection - } else if (0 == strcmp(extension, "GL_NV_texgen_reflection")) { -#endif - -#ifdef GL_NV_texture_env_combine4 - } else if (0 == strcmp(extension, "GL_NV_texture_env_combine4")) { -#endif - -#ifdef GL_NV_texture_rectangle - } else if (0 == strcmp(extension, "GL_NV_texture_rectangle")) { -#endif - -#ifdef GL_NV_texture_shader - } else if (0 == strcmp(extension, "GL_NV_texture_shader")) { -#endif - -#ifdef GL_NV_vertex_array_range - } else if (0 == strcmp(extension, "GL_NV_vertex_array_range")) { - GLH_EXT_NAME(glFlushVertexArrayRangeNV) = (PFNGLFLUSHVERTEXARRAYRANGENVPROC)GLH_EXT_GET_PROC_ADDRESS("glFlushVertexArrayRangeNV"); - if (NULL == GLH_EXT_NAME(glFlushVertexArrayRangeNV)) - return FALSE; - GLH_EXT_NAME(glVertexArrayRangeNV) = (PFNGLVERTEXARRAYRANGENVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexArrayRangeNV"); - if (NULL == GLH_EXT_NAME(glVertexArrayRangeNV)) - return FALSE; -# ifdef _WIN32 - GLH_EXT_NAME(wglAllocateMemoryNV) = (PFNWGLALLOCATEMEMORYNVPROC)GLH_EXT_GET_PROC_ADDRESS("wglAllocateMemoryNV"); - if (NULL == GLH_EXT_NAME(wglAllocateMemoryNV)) - return FALSE; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXT_NAME(glXAllocateMemoryNV) = (PFNGLXALLOCATEMEMORYNVPROC)GLH_EXT_GET_PROC_ADDRESS("glXAllocateMemoryNV"); - if (NULL == GLH_EXT_NAME(glXAllocateMemoryNV)) - return FALSE; -# endif -# ifdef _WIN32 - GLH_EXT_NAME(wglFreeMemoryNV) = (PFNWGLFREEMEMORYNVPROC)GLH_EXT_GET_PROC_ADDRESS("wglFreeMemoryNV"); - if (NULL == GLH_EXT_NAME(wglFreeMemoryNV)) - return FALSE; -# endif -# ifdef GLX_VERSION_1_3 - GLH_EXT_NAME(glXFreeMemoryNV) = (PFNGLXFREEMEMORYNVPROC)GLH_EXT_GET_PROC_ADDRESS("glXFreeMemoryNV"); - if (NULL == GLH_EXT_NAME(glXFreeMemoryNV)) - return FALSE; -# endif -#endif - -#ifdef GL_NV_vertex_program - } else if (0 == strcmp(extension, "GL_NV_vertex_program")) { - GLH_EXT_NAME(glAreProgramsResidentNV) = (PFNGLAREPROGRAMSRESIDENTNVPROC)GLH_EXT_GET_PROC_ADDRESS("glAreProgramsResidentNV"); - if (NULL == GLH_EXT_NAME(glAreProgramsResidentNV)) - return FALSE; - GLH_EXT_NAME(glBindProgramNV) = (PFNGLBINDPROGRAMNVPROC)GLH_EXT_GET_PROC_ADDRESS("glBindProgramNV"); - if (NULL == GLH_EXT_NAME(glBindProgramNV)) - return FALSE; - GLH_EXT_NAME(glDeleteProgramsNV) = (PFNGLDELETEPROGRAMSNVPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteProgramsNV"); - if (NULL == GLH_EXT_NAME(glDeleteProgramsNV)) - return FALSE; - GLH_EXT_NAME(glExecuteProgramNV) = (PFNGLEXECUTEPROGRAMNVPROC)GLH_EXT_GET_PROC_ADDRESS("glExecuteProgramNV"); - if (NULL == GLH_EXT_NAME(glExecuteProgramNV)) - return FALSE; - GLH_EXT_NAME(glGenProgramsNV) = (PFNGLGENPROGRAMSNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGenProgramsNV"); - if (NULL == GLH_EXT_NAME(glGenProgramsNV)) - return FALSE; - GLH_EXT_NAME(glGetProgramParameterdvNV) = (PFNGLGETPROGRAMPARAMETERDVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramParameterdvNV"); - if (NULL == GLH_EXT_NAME(glGetProgramParameterdvNV)) - return FALSE; - GLH_EXT_NAME(glGetProgramParameterfvNV) = (PFNGLGETPROGRAMPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramParameterfvNV"); - if (NULL == GLH_EXT_NAME(glGetProgramParameterfvNV)) - return FALSE; - GLH_EXT_NAME(glGetProgramivNV) = (PFNGLGETPROGRAMIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramivNV"); - if (NULL == GLH_EXT_NAME(glGetProgramivNV)) - return FALSE; - GLH_EXT_NAME(glGetProgramStringNV) = (PFNGLGETPROGRAMSTRINGNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramStringNV"); - if (NULL == GLH_EXT_NAME(glGetProgramStringNV)) - return FALSE; - GLH_EXT_NAME(glGetTrackMatrixivNV) = (PFNGLGETTRACKMATRIXIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetTrackMatrixivNV"); - if (NULL == GLH_EXT_NAME(glGetTrackMatrixivNV)) - return FALSE; - GLH_EXT_NAME(glGetVertexAttribdvNV) = (PFNGLGETVERTEXATTRIBDVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribdvNV"); - if (NULL == GLH_EXT_NAME(glGetVertexAttribdvNV)) - return FALSE; - GLH_EXT_NAME(glGetVertexAttribfvNV) = (PFNGLGETVERTEXATTRIBFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribfvNV"); - if (NULL == GLH_EXT_NAME(glGetVertexAttribfvNV)) - return FALSE; - GLH_EXT_NAME(glGetVertexAttribivNV) = (PFNGLGETVERTEXATTRIBIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribivNV"); - if (NULL == GLH_EXT_NAME(glGetVertexAttribivNV)) - return FALSE; - GLH_EXT_NAME(glGetVertexAttribPointervNV) = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribPointervNV"); - if (NULL == GLH_EXT_NAME(glGetVertexAttribPointervNV)) - return FALSE; - GLH_EXT_NAME(glIsProgramNV) = (PFNGLISPROGRAMNVPROC)GLH_EXT_GET_PROC_ADDRESS("glIsProgramNV"); - if (NULL == GLH_EXT_NAME(glIsProgramNV)) - return FALSE; - GLH_EXT_NAME(glLoadProgramNV) = (PFNGLLOADPROGRAMNVPROC)GLH_EXT_GET_PROC_ADDRESS("glLoadProgramNV"); - if (NULL == GLH_EXT_NAME(glLoadProgramNV)) - return FALSE; - GLH_EXT_NAME(glProgramParameter4dNV) = (PFNGLPROGRAMPARAMETER4DNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramParameter4dNV"); - if (NULL == GLH_EXT_NAME(glProgramParameter4dNV)) - return FALSE; - GLH_EXT_NAME(glProgramParameter4dvNV) = (PFNGLPROGRAMPARAMETER4DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramParameter4dvNV"); - if (NULL == GLH_EXT_NAME(glProgramParameter4dvNV)) - return FALSE; - GLH_EXT_NAME(glProgramParameter4fNV) = (PFNGLPROGRAMPARAMETER4FNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramParameter4fNV"); - if (NULL == GLH_EXT_NAME(glProgramParameter4fNV)) - return FALSE; - GLH_EXT_NAME(glProgramParameter4fvNV) = (PFNGLPROGRAMPARAMETER4FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramParameter4fvNV"); - if (NULL == GLH_EXT_NAME(glProgramParameter4fvNV)) - return FALSE; - GLH_EXT_NAME(glProgramParameters4dvNV) = (PFNGLPROGRAMPARAMETERS4DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramParameters4dvNV"); - if (NULL == GLH_EXT_NAME(glProgramParameters4dvNV)) - return FALSE; - GLH_EXT_NAME(glProgramParameters4fvNV) = (PFNGLPROGRAMPARAMETERS4FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramParameters4fvNV"); - if (NULL == GLH_EXT_NAME(glProgramParameters4fvNV)) - return FALSE; - GLH_EXT_NAME(glRequestResidentProgramsNV) = (PFNGLREQUESTRESIDENTPROGRAMSNVPROC)GLH_EXT_GET_PROC_ADDRESS("glRequestResidentProgramsNV"); - if (NULL == GLH_EXT_NAME(glRequestResidentProgramsNV)) - return FALSE; - GLH_EXT_NAME(glTrackMatrixNV) = (PFNGLTRACKMATRIXNVPROC)GLH_EXT_GET_PROC_ADDRESS("glTrackMatrixNV"); - if (NULL == GLH_EXT_NAME(glTrackMatrixNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttribPointerNV) = (PFNGLVERTEXATTRIBPOINTERNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribPointerNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribPointerNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib1dNV) = (PFNGLVERTEXATTRIB1DNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1dNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1dNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib1dvNV) = (PFNGLVERTEXATTRIB1DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1dvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1dvNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib1fNV) = (PFNGLVERTEXATTRIB1FNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1fNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1fNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib1fvNV) = (PFNGLVERTEXATTRIB1FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1fvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1fvNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib1sNV) = (PFNGLVERTEXATTRIB1SNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1sNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1sNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib1svNV) = (PFNGLVERTEXATTRIB1SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1svNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib1svNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib2dNV) = (PFNGLVERTEXATTRIB2DNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2dNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2dNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib2dvNV) = (PFNGLVERTEXATTRIB2DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2dvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2dvNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib2fNV) = (PFNGLVERTEXATTRIB2FNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2fNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2fNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib2fvNV) = (PFNGLVERTEXATTRIB2FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2fvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2fvNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib2sNV) = (PFNGLVERTEXATTRIB2SNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2sNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2sNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib2svNV) = (PFNGLVERTEXATTRIB2SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2svNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib2svNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib3dNV) = (PFNGLVERTEXATTRIB3DNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3dNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3dNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib3dvNV) = (PFNGLVERTEXATTRIB3DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3dvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3dvNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib3fNV) = (PFNGLVERTEXATTRIB3FNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3fNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3fNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib3fvNV) = (PFNGLVERTEXATTRIB3FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3fvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3fvNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib3sNV) = (PFNGLVERTEXATTRIB3SNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3sNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3sNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib3svNV) = (PFNGLVERTEXATTRIB3SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3svNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib3svNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib4dNV) = (PFNGLVERTEXATTRIB4DNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4dNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4dNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib4dvNV) = (PFNGLVERTEXATTRIB4DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4dvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4dvNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib4fNV) = (PFNGLVERTEXATTRIB4FNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4fNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4fNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib4fvNV) = (PFNGLVERTEXATTRIB4FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4fvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4fvNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib4sNV) = (PFNGLVERTEXATTRIB4SNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4sNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4sNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib4svNV) = (PFNGLVERTEXATTRIB4SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4svNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4svNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttrib4ubvNV) = (PFNGLVERTEXATTRIB4UBVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4ubvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttrib4ubvNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttribs1dvNV) = (PFNGLVERTEXATTRIBS1DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs1dvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs1dvNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttribs1fvNV) = (PFNGLVERTEXATTRIBS1FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs1fvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs1fvNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttribs1svNV) = (PFNGLVERTEXATTRIBS1SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs1svNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs1svNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttribs2dvNV) = (PFNGLVERTEXATTRIBS2DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs2dvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs2dvNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttribs2fvNV) = (PFNGLVERTEXATTRIBS2FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs2fvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs2fvNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttribs2svNV) = (PFNGLVERTEXATTRIBS2SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs2svNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs2svNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttribs3dvNV) = (PFNGLVERTEXATTRIBS3DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs3dvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs3dvNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttribs3fvNV) = (PFNGLVERTEXATTRIBS3FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs3fvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs3fvNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttribs3svNV) = (PFNGLVERTEXATTRIBS3SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs3svNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs3svNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttribs4dvNV) = (PFNGLVERTEXATTRIBS4DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs4dvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs4dvNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttribs4fvNV) = (PFNGLVERTEXATTRIBS4FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs4fvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs4fvNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttribs4svNV) = (PFNGLVERTEXATTRIBS4SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs4svNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs4svNV)) - return FALSE; - GLH_EXT_NAME(glVertexAttribs4ubvNV) = (PFNGLVERTEXATTRIBS4UBVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs4ubvNV"); - if (NULL == GLH_EXT_NAME(glVertexAttribs4ubvNV)) - return FALSE; -#endif - -#ifdef GL_SGIS_generate_mipmap - } else if (0 == strcmp(extension, "GL_SGIS_generate_mipmap")) { -#endif - -#ifdef GL_SGIS_texture_lod - } else if (0 == strcmp(extension, "GL_SGIS_texture_lod")) { -#endif - -#ifdef GL_SGIX_depth_texture - } else if (0 == strcmp(extension, "GL_SGIX_depth_texture")) { -#endif - -#ifdef GL_SGIX_shadow - } else if (0 == strcmp(extension, "GL_SGIX_shadow")) { -#endif - -#ifdef GL_VERSION_1_2 - } else if (0 == strcmp(extension, "GL_VERSION_1_2")) { - GLH_CORE_1_2_NAME(glBlendColor) = (PFNGLBLENDCOLORPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendColor"); - if (NULL == GLH_CORE_1_2_NAME(glBlendColor)) - return FALSE; - GLH_CORE_1_2_NAME(glBlendEquation) = (PFNGLBLENDEQUATIONPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendEquation"); - if (NULL == GLH_CORE_1_2_NAME(glBlendEquation)) - return FALSE; - GLH_CORE_1_2_NAME(glDrawRangeElements) = (PFNGLDRAWRANGEELEMENTSPROC)GLH_EXT_GET_PROC_ADDRESS("glDrawRangeElements"); - if (NULL == GLH_CORE_1_2_NAME(glDrawRangeElements)) - return FALSE; - GLH_CORE_1_2_NAME(glColorTable) = (PFNGLCOLORTABLEPROC)GLH_EXT_GET_PROC_ADDRESS("glColorTable"); - if (NULL == GLH_CORE_1_2_NAME(glColorTable)) - return FALSE; - GLH_CORE_1_2_NAME(glColorTableParameterfv) = (PFNGLCOLORTABLEPARAMETERFVPROC)GLH_EXT_GET_PROC_ADDRESS("glColorTableParameterfv"); - if (NULL == GLH_CORE_1_2_NAME(glColorTableParameterfv)) - return FALSE; - GLH_CORE_1_2_NAME(glColorTableParameteriv) = (PFNGLCOLORTABLEPARAMETERIVPROC)GLH_EXT_GET_PROC_ADDRESS("glColorTableParameteriv"); - if (NULL == GLH_CORE_1_2_NAME(glColorTableParameteriv)) - return FALSE; - GLH_CORE_1_2_NAME(glCopyColorTable) = (PFNGLCOPYCOLORTABLEPROC)GLH_EXT_GET_PROC_ADDRESS("glCopyColorTable"); - if (NULL == GLH_CORE_1_2_NAME(glCopyColorTable)) - return FALSE; - GLH_CORE_1_2_NAME(glGetColorTable) = (PFNGLGETCOLORTABLEPROC)GLH_EXT_GET_PROC_ADDRESS("glGetColorTable"); - if (NULL == GLH_CORE_1_2_NAME(glGetColorTable)) - return FALSE; - GLH_CORE_1_2_NAME(glGetColorTableParameterfv) = (PFNGLGETCOLORTABLEPARAMETERFVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetColorTableParameterfv"); - if (NULL == GLH_CORE_1_2_NAME(glGetColorTableParameterfv)) - return FALSE; - GLH_CORE_1_2_NAME(glGetColorTableParameteriv) = (PFNGLGETCOLORTABLEPARAMETERIVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetColorTableParameteriv"); - if (NULL == GLH_CORE_1_2_NAME(glGetColorTableParameteriv)) - return FALSE; - GLH_CORE_1_2_NAME(glTexImage3D) = (PFNGLTEXIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glTexImage3D"); - if (NULL == GLH_CORE_1_2_NAME(glTexImage3D)) - return FALSE; - GLH_CORE_1_2_NAME(glTexSubImage3D) = (PFNGLTEXSUBIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glTexSubImage3D"); - if (NULL == GLH_CORE_1_2_NAME(glTexSubImage3D)) - return FALSE; - GLH_CORE_1_2_NAME(glCopyTexSubImage3D) = (PFNGLCOPYTEXSUBIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glCopyTexSubImage3D"); - if (NULL == GLH_CORE_1_2_NAME(glCopyTexSubImage3D)) - return FALSE; -#endif - -#ifdef GL_WIN_swap_hint - } else if (0 == strcmp(extension, "GL_WIN_swap_hint")) { - GLH_EXT_NAME(glAddSwapHintRectWIN) = (PFNGLADDSWAPHINTRECTWINPROC)GLH_EXT_GET_PROC_ADDRESS("glAddSwapHintRectWIN"); - if (NULL == GLH_EXT_NAME(glAddSwapHintRectWIN)) - return FALSE; -#endif - -#ifdef WGL_ARB_pbuffer - } else if (0 == strcmp(extension, "WGL_ARB_pbuffer")) { -# ifdef _WIN32 - GLH_EXT_NAME(wglCreatePbufferARB) = (PFNWGLCREATEPBUFFERARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglCreatePbufferARB"); - if (NULL == GLH_EXT_NAME(wglCreatePbufferARB)) - return FALSE; -# endif -# ifdef _WIN32 - GLH_EXT_NAME(wglGetPbufferDCARB) = (PFNWGLGETPBUFFERDCARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglGetPbufferDCARB"); - if (NULL == GLH_EXT_NAME(wglGetPbufferDCARB)) - return FALSE; -# endif -# ifdef _WIN32 - GLH_EXT_NAME(wglReleasePbufferDCARB) = (PFNWGLRELEASEPBUFFERDCARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglReleasePbufferDCARB"); - if (NULL == GLH_EXT_NAME(wglReleasePbufferDCARB)) - return FALSE; -# endif -# ifdef _WIN32 - GLH_EXT_NAME(wglDestroyPbufferARB) = (PFNWGLDESTROYPBUFFERARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglDestroyPbufferARB"); - if (NULL == GLH_EXT_NAME(wglDestroyPbufferARB)) - return FALSE; -# endif -# ifdef _WIN32 - GLH_EXT_NAME(wglQueryPbufferARB) = (PFNWGLQUERYPBUFFERARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglQueryPbufferARB"); - if (NULL == GLH_EXT_NAME(wglQueryPbufferARB)) - return FALSE; -# endif -#endif - -#ifdef WGL_ARB_render_texture -# ifdef _WIN32 - GLH_EXT_NAME(wglBindTexImageARB) = (PFNWGLBINDTEXIMAGEARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglBindTexImageARB"); - if (NULL == GLH_EXT_NAME(wglBindTexImageARB)) - return FALSE; -# endif -# ifdef _WIN32 - GLH_EXT_NAME(wglReleaseTexImageARB) = (PFNWGLRELEASETEXIMAGEARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglReleaseTexImageARB"); - if (NULL == GLH_EXT_NAME(wglReleaseTexImageARB)) - return FALSE; -# endif -# ifdef _WIN32 - GLH_EXT_NAME(wglSetPbufferAttribARB) = (PFNWGLSETPBUFFERATTRIBARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglSetPbufferAttribARB"); - if (NULL == GLH_EXT_NAME(wglSetPbufferAttribARB)) - return FALSE; -# endif -#endif - -#ifdef WGL_ARB_pixel_format - } else if (0 == strcmp(extension, "WGL_ARB_pixel_format")) { -# ifdef _WIN32 - GLH_EXT_NAME(wglGetPixelFormatAttribivARB) = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglGetPixelFormatAttribivARB"); - if (NULL == GLH_EXT_NAME(wglGetPixelFormatAttribivARB)) - return FALSE; -# endif -# ifdef _WIN32 - GLH_EXT_NAME(wglGetPixelFormatAttribfvARB) = (PFNWGLGETPIXELFORMATATTRIBFVARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglGetPixelFormatAttribfvARB"); - if (NULL == GLH_EXT_NAME(wglGetPixelFormatAttribfvARB)) - return FALSE; -# endif -# ifdef _WIN32 - GLH_EXT_NAME(wglChoosePixelFormatARB) = (PFNWGLCHOOSEPIXELFORMATARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglChoosePixelFormatARB"); - if (NULL == GLH_EXT_NAME(wglChoosePixelFormatARB)) - return FALSE; -# endif -#endif - - } else { - return FALSE; - } - return TRUE; -} -#endif - -#else // defined(__APPLE__) - -#ifdef GLH_EXT_SINGLE_FILE - -int glh_init_extension(const char* extension) -{ - // MBW -- XXX -- Should this check for extension availability? - return TRUE; -} -#endif // GLH_EXT_SINGLE_FILE - -#endif // defined(__APPLE__) - -#undef GLH_EXT_SINGLE_FILE - -#endif /* GLH_GENEXT_H */ +/* File generated by extgen.cpp -- do not modify */ +#ifndef GLH_GENEXT_H +#define GLH_GENEXT_H + +#include +#include +#ifdef _WIN32 /* supports windows, x -- need to generalize */ +# include +# define GLH_EXT_GET_PROC_ADDRESS(p) wglGetProcAddress(p) +#elif GLX_VERSION_1_3 +# include +# include +# include +# define GLH_EXT_GET_PROC_ADDRESS(p) glXGetProcAddressARB( (const GLubyte *) p) +#endif + +#ifdef GLH_EXT_SINGLE_FILE +# define GLH_EXTERN +# define GLH_INITIALIZER = 0 +#else +# define GLH_EXTERN extern +# define GLH_INITIALIZER +#endif + +#define GLH__PREPROCESSOR_GYMNASTICS2(a,b) a##b +#define GLH__PREPROCESSOR_GYMNASTICS(a,b) GLH__PREPROCESSOR_GYMNASTICS2(a,b) + +#ifndef _WIN32 +#define GLH_EXT_PREFIX _ +#endif +#ifndef GLH_EXT_PREFIX +# define GLH_EXT_NAME(a) a +#else +# define GLH_EXT_NAME(a) GLH__PREPROCESSOR_GYMNASTICS(GLH_EXT_PREFIX,a) +#endif + +#ifndef _WIN32 +# ifndef GLH_CORE_1_2_PREFIX +# define GLH_CORE_1_2_PREFIX _ +# endif +#endif + +#ifndef GLH_CORE_1_2_PREFIX +# define GLH_CORE_1_2_NAME(a) a +#else +# define GLH_CORE_1_2_NAME(a) GLH__PREPROCESSOR_GYMNASTICS(GLH_CORE_1_2_PREFIX,a) +#endif + +#ifdef _WIN32 +#ifdef GL_VERSION_1_2 + /* These routines are prefixed by the preprocessor constant + GLH_CORE_1_2_PREFIX to avoid colliding with the OpenGL 1.2 namespace. */ + GLH_EXTERN PFNGLBLENDCOLORPROC GLH_CORE_1_2_NAME(glBlendColor) GLH_INITIALIZER; + GLH_EXTERN PFNGLBLENDEQUATIONPROC GLH_CORE_1_2_NAME(glBlendEquation) GLH_INITIALIZER; + GLH_EXTERN PFNGLDRAWRANGEELEMENTSPROC GLH_CORE_1_2_NAME(glDrawRangeElements) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOLORTABLEPROC GLH_CORE_1_2_NAME(glColorTable) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOLORTABLEPARAMETERFVPROC GLH_CORE_1_2_NAME(glColorTableParameterfv) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOLORTABLEPARAMETERIVPROC GLH_CORE_1_2_NAME(glColorTableParameteriv) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOPYCOLORTABLEPROC GLH_CORE_1_2_NAME(glCopyColorTable) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETCOLORTABLEPROC GLH_CORE_1_2_NAME(glGetColorTable) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETCOLORTABLEPARAMETERFVPROC GLH_CORE_1_2_NAME(glGetColorTableParameterfv) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETCOLORTABLEPARAMETERIVPROC GLH_CORE_1_2_NAME(glGetColorTableParameteriv) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOLORSUBTABLEPROC GLH_CORE_1_2_NAME(glColorSubTable) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOPYCOLORSUBTABLEPROC GLH_CORE_1_2_NAME(glCopyColorSubTable) GLH_INITIALIZER; + GLH_EXTERN PFNGLCONVOLUTIONFILTER1DPROC GLH_CORE_1_2_NAME(glConvolutionFilter1D) GLH_INITIALIZER; + GLH_EXTERN PFNGLCONVOLUTIONFILTER2DPROC GLH_CORE_1_2_NAME(glConvolutionFilter2D) GLH_INITIALIZER; + GLH_EXTERN PFNGLCONVOLUTIONPARAMETERFPROC GLH_CORE_1_2_NAME(glConvolutionParameterf) GLH_INITIALIZER; + GLH_EXTERN PFNGLCONVOLUTIONPARAMETERFVPROC GLH_CORE_1_2_NAME(glConvolutionParameterfv) GLH_INITIALIZER; + GLH_EXTERN PFNGLCONVOLUTIONPARAMETERIPROC GLH_CORE_1_2_NAME(glConvolutionParameteri) GLH_INITIALIZER; + GLH_EXTERN PFNGLCONVOLUTIONPARAMETERIVPROC GLH_CORE_1_2_NAME(glConvolutionParameteriv) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOPYCONVOLUTIONFILTER1DPROC GLH_CORE_1_2_NAME(glCopyConvolutionFilter1D) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOPYCONVOLUTIONFILTER2DPROC GLH_CORE_1_2_NAME(glCopyConvolutionFilter2D) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETCONVOLUTIONFILTERPROC GLH_CORE_1_2_NAME(glGetConvolutionFilter) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETCONVOLUTIONPARAMETERFVPROC GLH_CORE_1_2_NAME(glGetConvolutionParameterfv) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETCONVOLUTIONPARAMETERIVPROC GLH_CORE_1_2_NAME(glGetConvolutionParameteriv) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETSEPARABLEFILTERPROC GLH_CORE_1_2_NAME(glGetSeparableFilter) GLH_INITIALIZER; + GLH_EXTERN PFNGLSEPARABLEFILTER2DPROC GLH_CORE_1_2_NAME(glSeparableFilter2D) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETHISTOGRAMPROC GLH_CORE_1_2_NAME(glGetHistogram) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETHISTOGRAMPARAMETERFVPROC GLH_CORE_1_2_NAME(glGetHistogramParameterfv) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETHISTOGRAMPARAMETERIVPROC GLH_CORE_1_2_NAME(glGetHistogramParameteriv) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETMINMAXPROC GLH_CORE_1_2_NAME(glGetMinmax) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETMINMAXPARAMETERFVPROC GLH_CORE_1_2_NAME(glGetMinmaxParameterfv) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETMINMAXPARAMETERIVPROC GLH_CORE_1_2_NAME(glGetMinmaxParameteriv) GLH_INITIALIZER; + GLH_EXTERN PFNGLHISTOGRAMPROC GLH_CORE_1_2_NAME(glHistogram) GLH_INITIALIZER; + GLH_EXTERN PFNGLMINMAXPROC GLH_CORE_1_2_NAME(glMinmax) GLH_INITIALIZER; + GLH_EXTERN PFNGLRESETHISTOGRAMPROC GLH_CORE_1_2_NAME(glResetHistogram) GLH_INITIALIZER; + GLH_EXTERN PFNGLRESETMINMAXPROC GLH_CORE_1_2_NAME(glResetMinmax) GLH_INITIALIZER; + GLH_EXTERN PFNGLTEXIMAGE3DPROC GLH_CORE_1_2_NAME(glTexImage3D) GLH_INITIALIZER; + GLH_EXTERN PFNGLTEXSUBIMAGE3DPROC GLH_CORE_1_2_NAME(glTexSubImage3D) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOPYTEXSUBIMAGE3DPROC GLH_CORE_1_2_NAME(glCopyTexSubImage3D) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD1DPROC GLH_CORE_1_2_NAME(glMultiTexCoord1d) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD1DVPROC GLH_CORE_1_2_NAME(glMultiTexCoord1dv) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD1FPROC GLH_CORE_1_2_NAME(glMultiTexCoord1f) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD1FVPROC GLH_CORE_1_2_NAME(glMultiTexCoord1fv) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD1IPROC GLH_CORE_1_2_NAME(glMultiTexCoord1i) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD1IVPROC GLH_CORE_1_2_NAME(glMultiTexCoord1iv) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD1SPROC GLH_CORE_1_2_NAME(glMultiTexCoord1s) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD1SVPROC GLH_CORE_1_2_NAME(glMultiTexCoord1sv) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD2DPROC GLH_CORE_1_2_NAME(glMultiTexCoord2d) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD2DVPROC GLH_CORE_1_2_NAME(glMultiTexCoord2dv) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD2FPROC GLH_CORE_1_2_NAME(glMultiTexCoord2f) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD2FVPROC GLH_CORE_1_2_NAME(glMultiTexCoord2fv) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD2IPROC GLH_CORE_1_2_NAME(glMultiTexCoord2i) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD2IVPROC GLH_CORE_1_2_NAME(glMultiTexCoord2iv) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD2SPROC GLH_CORE_1_2_NAME(glMultiTexCoord2s) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD2SVPROC GLH_CORE_1_2_NAME(glMultiTexCoord2sv) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD3DPROC GLH_CORE_1_2_NAME(glMultiTexCoord3d) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD3DVPROC GLH_CORE_1_2_NAME(glMultiTexCoord3dv) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD3FPROC GLH_CORE_1_2_NAME(glMultiTexCoord3f) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD3FVPROC GLH_CORE_1_2_NAME(glMultiTexCoord3fv) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD3IPROC GLH_CORE_1_2_NAME(glMultiTexCoord3i) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD3IVPROC GLH_CORE_1_2_NAME(glMultiTexCoord3iv) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD3SPROC GLH_CORE_1_2_NAME(glMultiTexCoord3s) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD3SVPROC GLH_CORE_1_2_NAME(glMultiTexCoord3sv) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD4DPROC GLH_CORE_1_2_NAME(glMultiTexCoord4d) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD4DVPROC GLH_CORE_1_2_NAME(glMultiTexCoord4dv) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD4FPROC GLH_CORE_1_2_NAME(glMultiTexCoord4f) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD4FVPROC GLH_CORE_1_2_NAME(glMultiTexCoord4fv) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD4IPROC GLH_CORE_1_2_NAME(glMultiTexCoord4i) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD4IVPROC GLH_CORE_1_2_NAME(glMultiTexCoord4iv) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD4SPROC GLH_CORE_1_2_NAME(glMultiTexCoord4s) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD4SVPROC GLH_CORE_1_2_NAME(glMultiTexCoord4sv) GLH_INITIALIZER; + GLH_EXTERN PFNGLACTIVETEXTUREPROC GLH_CORE_1_2_NAME(glActiveTexture) GLH_INITIALIZER; + GLH_EXTERN PFNGLCLIENTACTIVETEXTUREPROC GLH_CORE_1_2_NAME(glClientActiveTexture) GLH_INITIALIZER; +#endif +#endif + +#ifdef GL_VERSION_1_3 + GLH_EXTERN PFNGLCOMPRESSEDTEXIMAGE3DPROC GLH_EXT_NAME(glCompressedTexImage3D) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOMPRESSEDTEXIMAGE2DPROC GLH_EXT_NAME(glCompressedTexImage2D) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOMPRESSEDTEXIMAGE1DPROC GLH_EXT_NAME(glCompressedTexImage1D) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC GLH_EXT_NAME(glCompressedTexSubImage3D) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC GLH_EXT_NAME(glCompressedTexSubImage2D) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC GLH_EXT_NAME(glCompressedTexSubImage1D) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETCOMPRESSEDTEXIMAGEPROC GLH_EXT_NAME(glGetCompressedTexImage) GLH_INITIALIZER; + GLH_EXTERN PFNGLSAMPLECOVERAGEPROC GLH_EXT_NAME(glSampleCoverage) GLH_INITIALIZER; + GLH_EXTERN PFNGLLOADTRANSPOSEMATRIXFPROC GLH_EXT_NAME(glLoadTransposeMatrixf) GLH_INITIALIZER; + GLH_EXTERN PFNGLLOADTRANSPOSEMATRIXDPROC GLH_EXT_NAME(glLoadTransposeMatrixd) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTTRANSPOSEMATRIXFPROC GLH_EXT_NAME(glMultTransposeMatrixf) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTTRANSPOSEMATRIXDPROC GLH_EXT_NAME(glMultTransposeMatrixd) GLH_INITIALIZER; +#endif + +#ifdef GL_VERSION_1_4 + GLH_EXTERN PFNGLMULTIDRAWARRAYSPROC GLH_EXT_NAME(glMultiDrawArrays) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTIDRAWELEMENTSPROC GLH_EXT_NAME(glMultiDrawElements) GLH_INITIALIZER; + GLH_EXTERN PFNGLPOINTPARAMETERFPROC GLH_EXT_NAME(glPointParameterf) GLH_INITIALIZER; + GLH_EXTERN PFNGLPOINTPARAMETERFVPROC GLH_EXT_NAME(glPointParameterfv) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3BPROC GLH_EXT_NAME(glSecondaryColor3b) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3BVPROC GLH_EXT_NAME(glSecondaryColor3bv) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3DPROC GLH_EXT_NAME(glSecondaryColor3d) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3DVPROC GLH_EXT_NAME(glSecondaryColor3dv) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3FPROC GLH_EXT_NAME(glSecondaryColor3f) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3FVPROC GLH_EXT_NAME(glSecondaryColor3fv) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3IPROC GLH_EXT_NAME(glSecondaryColor3i) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3IVPROC GLH_EXT_NAME(glSecondaryColor3iv) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3SPROC GLH_EXT_NAME(glSecondaryColor3s) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3SVPROC GLH_EXT_NAME(glSecondaryColor3sv) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3UBPROC GLH_EXT_NAME(glSecondaryColor3ub) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3UBVPROC GLH_EXT_NAME(glSecondaryColor3ubv) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3UIPROC GLH_EXT_NAME(glSecondaryColor3ui) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3UIVPROC GLH_EXT_NAME(glSecondaryColor3uiv) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3USPROC GLH_EXT_NAME(glSecondaryColor3us) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3USVPROC GLH_EXT_NAME(glSecondaryColor3usv) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLORPOINTERPROC GLH_EXT_NAME(glSecondaryColorPointer) GLH_INITIALIZER; + GLH_EXTERN PFNGLBLENDFUNCSEPARATEPROC GLH_EXT_NAME(glBlendFuncSeparate) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS2DPROC GLH_EXT_NAME(glWindowPos2d) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS2FPROC GLH_EXT_NAME(glWindowPos2f) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS2IPROC GLH_EXT_NAME(glWindowPos2i) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS2SPROC GLH_EXT_NAME(glWindowPos2s) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS2DVPROC GLH_EXT_NAME(glWindowPos2dv) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS2FVPROC GLH_EXT_NAME(glWindowPos2fv) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS2IVPROC GLH_EXT_NAME(glWindowPos2iv) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS2SVPROC GLH_EXT_NAME(glWindowPos2sv) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS3DPROC GLH_EXT_NAME(glWindowPos3d) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS3FPROC GLH_EXT_NAME(glWindowPos3f) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS3IPROC GLH_EXT_NAME(glWindowPos3i) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS3SPROC GLH_EXT_NAME(glWindowPos3s) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS3DVPROC GLH_EXT_NAME(glWindowPos3dv) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS3FVPROC GLH_EXT_NAME(glWindowPos3fv) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS3IVPROC GLH_EXT_NAME(glWindowPos3iv) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS3SVPROC GLH_EXT_NAME(glWindowPos3sv) GLH_INITIALIZER; +#endif + +#ifdef GL_ARB_depth_texture +#endif + +#ifdef GL_ARB_fragment_program +#endif + +#ifdef GL_ARB_multisample +#endif + +#ifdef _WIN32 +#ifdef GL_ARB_multitexture + GLH_EXTERN PFNGLMULTITEXCOORD1DARBPROC GLH_EXT_NAME(glMultiTexCoord1dARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD1DVARBPROC GLH_EXT_NAME(glMultiTexCoord1dvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD1FARBPROC GLH_EXT_NAME(glMultiTexCoord1fARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD1FVARBPROC GLH_EXT_NAME(glMultiTexCoord1fvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD1IARBPROC GLH_EXT_NAME(glMultiTexCoord1iARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD1IVARBPROC GLH_EXT_NAME(glMultiTexCoord1ivARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD1SARBPROC GLH_EXT_NAME(glMultiTexCoord1sARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD1SVARBPROC GLH_EXT_NAME(glMultiTexCoord1svARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD2DARBPROC GLH_EXT_NAME(glMultiTexCoord2dARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD2DVARBPROC GLH_EXT_NAME(glMultiTexCoord2dvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD2FARBPROC GLH_EXT_NAME(glMultiTexCoord2fARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD2FVARBPROC GLH_EXT_NAME(glMultiTexCoord2fvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD2IARBPROC GLH_EXT_NAME(glMultiTexCoord2iARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD2IVARBPROC GLH_EXT_NAME(glMultiTexCoord2ivARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD2SARBPROC GLH_EXT_NAME(glMultiTexCoord2sARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD2SVARBPROC GLH_EXT_NAME(glMultiTexCoord2svARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD3DARBPROC GLH_EXT_NAME(glMultiTexCoord3dARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD3DVARBPROC GLH_EXT_NAME(glMultiTexCoord3dvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD3FARBPROC GLH_EXT_NAME(glMultiTexCoord3fARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD3FVARBPROC GLH_EXT_NAME(glMultiTexCoord3fvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD3IARBPROC GLH_EXT_NAME(glMultiTexCoord3iARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD3IVARBPROC GLH_EXT_NAME(glMultiTexCoord3ivARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD3SARBPROC GLH_EXT_NAME(glMultiTexCoord3sARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD3SVARBPROC GLH_EXT_NAME(glMultiTexCoord3svARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD4DARBPROC GLH_EXT_NAME(glMultiTexCoord4dARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD4DVARBPROC GLH_EXT_NAME(glMultiTexCoord4dvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD4FARBPROC GLH_EXT_NAME(glMultiTexCoord4fARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD4FVARBPROC GLH_EXT_NAME(glMultiTexCoord4fvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD4IARBPROC GLH_EXT_NAME(glMultiTexCoord4iARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD4IVARBPROC GLH_EXT_NAME(glMultiTexCoord4ivARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD4SARBPROC GLH_EXT_NAME(glMultiTexCoord4sARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD4SVARBPROC GLH_EXT_NAME(glMultiTexCoord4svARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLACTIVETEXTUREARBPROC GLH_EXT_NAME(glActiveTextureARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLCLIENTACTIVETEXTUREARBPROC GLH_EXT_NAME(glClientActiveTextureARB) GLH_INITIALIZER; +#endif +#endif + +#ifdef GL_ARB_point_parameters + GLH_EXTERN PFNGLPOINTPARAMETERFARBPROC GLH_EXT_NAME(glPointParameterfARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLPOINTPARAMETERFVARBPROC GLH_EXT_NAME(glPointParameterfvARB) GLH_INITIALIZER; +#endif + +#ifdef GL_ARB_shadow +#endif + +#ifdef GL_ARB_texture_border_clamp +#endif + +#ifdef GL_ARB_texture_compression + GLH_EXTERN PFNGLCOMPRESSEDTEXIMAGE3DARBPROC GLH_EXT_NAME(glCompressedTexImage3DARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOMPRESSEDTEXIMAGE2DARBPROC GLH_EXT_NAME(glCompressedTexImage2DARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOMPRESSEDTEXIMAGE1DARBPROC GLH_EXT_NAME(glCompressedTexImage1DARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC GLH_EXT_NAME(glCompressedTexSubImage3DARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC GLH_EXT_NAME(glCompressedTexSubImage2DARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC GLH_EXT_NAME(glCompressedTexSubImage1DARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETCOMPRESSEDTEXIMAGEARBPROC GLH_EXT_NAME(glGetCompressedTexImageARB) GLH_INITIALIZER; +#endif + +#ifdef GL_ARB_texture_cube_map +#endif + +#ifdef GL_ARB_texture_env_add +#endif + +#ifdef GL_ARB_texture_env_combine +#endif + +#ifdef GL_ARB_texture_env_dot3 +#endif + +#ifdef GL_ARB_texture_mirrored_repeat +#endif + +#ifdef GL_ARB_transpose_matrix + GLH_EXTERN PFNGLLOADTRANSPOSEMATRIXFARBPROC GLH_EXT_NAME(glLoadTransposeMatrixfARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLLOADTRANSPOSEMATRIXDARBPROC GLH_EXT_NAME(glLoadTransposeMatrixdARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTTRANSPOSEMATRIXFARBPROC GLH_EXT_NAME(glMultTransposeMatrixfARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTTRANSPOSEMATRIXDARBPROC GLH_EXT_NAME(glMultTransposeMatrixdARB) GLH_INITIALIZER; +#endif + +#ifdef GL_ARB_vertex_program + GLH_EXTERN PFNGLVERTEXATTRIB1SARBPROC GLH_EXT_NAME(glVertexAttrib1sARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB1FARBPROC GLH_EXT_NAME(glVertexAttrib1fARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB1DARBPROC GLH_EXT_NAME(glVertexAttrib1dARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB2SARBPROC GLH_EXT_NAME(glVertexAttrib2sARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB2FARBPROC GLH_EXT_NAME(glVertexAttrib2fARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB2DARBPROC GLH_EXT_NAME(glVertexAttrib2dARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB3SARBPROC GLH_EXT_NAME(glVertexAttrib3sARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB3FARBPROC GLH_EXT_NAME(glVertexAttrib3fARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB3DARBPROC GLH_EXT_NAME(glVertexAttrib3dARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4SARBPROC GLH_EXT_NAME(glVertexAttrib4sARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4FARBPROC GLH_EXT_NAME(glVertexAttrib4fARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4DARBPROC GLH_EXT_NAME(glVertexAttrib4dARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4NUBARBPROC GLH_EXT_NAME(glVertexAttrib4NubARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB1SVARBPROC GLH_EXT_NAME(glVertexAttrib1svARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB1FVARBPROC GLH_EXT_NAME(glVertexAttrib1fvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB1DVARBPROC GLH_EXT_NAME(glVertexAttrib1dvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB2SVARBPROC GLH_EXT_NAME(glVertexAttrib2svARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB2FVARBPROC GLH_EXT_NAME(glVertexAttrib2fvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB2DVARBPROC GLH_EXT_NAME(glVertexAttrib2dvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB3SVARBPROC GLH_EXT_NAME(glVertexAttrib3svARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB3FVARBPROC GLH_EXT_NAME(glVertexAttrib3fvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB3DVARBPROC GLH_EXT_NAME(glVertexAttrib3dvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4BVARBPROC GLH_EXT_NAME(glVertexAttrib4bvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4SVARBPROC GLH_EXT_NAME(glVertexAttrib4svARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4IVARBPROC GLH_EXT_NAME(glVertexAttrib4ivARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4UBVARBPROC GLH_EXT_NAME(glVertexAttrib4ubvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4USVARBPROC GLH_EXT_NAME(glVertexAttrib4usvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4UIVARBPROC GLH_EXT_NAME(glVertexAttrib4uivARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4FVARBPROC GLH_EXT_NAME(glVertexAttrib4fvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4DVARBPROC GLH_EXT_NAME(glVertexAttrib4dvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4NBVARBPROC GLH_EXT_NAME(glVertexAttrib4NbvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4NSVARBPROC GLH_EXT_NAME(glVertexAttrib4NsvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4NIVARBPROC GLH_EXT_NAME(glVertexAttrib4NivARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4NUBVARBPROC GLH_EXT_NAME(glVertexAttrib4NubvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4NUSVARBPROC GLH_EXT_NAME(glVertexAttrib4NusvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4NUIVARBPROC GLH_EXT_NAME(glVertexAttrib4NuivARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIBPOINTERARBPROC GLH_EXT_NAME(glVertexAttribPointerARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLENABLEVERTEXATTRIBARRAYARBPROC GLH_EXT_NAME(glEnableVertexAttribArrayARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLDISABLEVERTEXATTRIBARRAYARBPROC GLH_EXT_NAME(glDisableVertexAttribArrayARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLPROGRAMSTRINGARBPROC GLH_EXT_NAME(glProgramStringARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLBINDPROGRAMARBPROC GLH_EXT_NAME(glBindProgramARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLDELETEPROGRAMSARBPROC GLH_EXT_NAME(glDeleteProgramsARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLGENPROGRAMSARBPROC GLH_EXT_NAME(glGenProgramsARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLPROGRAMENVPARAMETER4DARBPROC GLH_EXT_NAME(glProgramEnvParameter4dARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLPROGRAMENVPARAMETER4DVARBPROC GLH_EXT_NAME(glProgramEnvParameter4dvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLPROGRAMENVPARAMETER4FARBPROC GLH_EXT_NAME(glProgramEnvParameter4fARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLPROGRAMENVPARAMETER4FVARBPROC GLH_EXT_NAME(glProgramEnvParameter4fvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLPROGRAMLOCALPARAMETER4DARBPROC GLH_EXT_NAME(glProgramLocalParameter4dARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLPROGRAMLOCALPARAMETER4DVARBPROC GLH_EXT_NAME(glProgramLocalParameter4dvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLPROGRAMLOCALPARAMETER4FARBPROC GLH_EXT_NAME(glProgramLocalParameter4fARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLPROGRAMLOCALPARAMETER4FVARBPROC GLH_EXT_NAME(glProgramLocalParameter4fvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETPROGRAMENVPARAMETERDVARBPROC GLH_EXT_NAME(glGetProgramEnvParameterdvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETPROGRAMENVPARAMETERFVARBPROC GLH_EXT_NAME(glGetProgramEnvParameterfvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC GLH_EXT_NAME(glGetProgramLocalParameterdvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC GLH_EXT_NAME(glGetProgramLocalParameterfvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETPROGRAMIVARBPROC GLH_EXT_NAME(glGetProgramivARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETPROGRAMSTRINGARBPROC GLH_EXT_NAME(glGetProgramStringARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETVERTEXATTRIBDVARBPROC GLH_EXT_NAME(glGetVertexAttribdvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETVERTEXATTRIBFVARBPROC GLH_EXT_NAME(glGetVertexAttribfvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETVERTEXATTRIBIVARBPROC GLH_EXT_NAME(glGetVertexAttribivARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETVERTEXATTRIBPOINTERVARBPROC GLH_EXT_NAME(glGetVertexAttribPointervARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLISPROGRAMARBPROC GLH_EXT_NAME(glIsProgramARB) GLH_INITIALIZER; +#endif + +#ifdef GL_ARB_window_pos + GLH_EXTERN PFNGLWINDOWPOS2DARBPROC GLH_EXT_NAME(glWindowPos2dARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS2FARBPROC GLH_EXT_NAME(glWindowPos2fARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS2IARBPROC GLH_EXT_NAME(glWindowPos2iARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS2SARBPROC GLH_EXT_NAME(glWindowPos2sARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS2DVARBPROC GLH_EXT_NAME(glWindowPos2dvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS2FVARBPROC GLH_EXT_NAME(glWindowPos2fvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS2IVARBPROC GLH_EXT_NAME(glWindowPos2ivARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS2SVARBPROC GLH_EXT_NAME(glWindowPos2svARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS3DARBPROC GLH_EXT_NAME(glWindowPos3dARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS3FARBPROC GLH_EXT_NAME(glWindowPos3fARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS3IARBPROC GLH_EXT_NAME(glWindowPos3iARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS3SARBPROC GLH_EXT_NAME(glWindowPos3sARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS3DVARBPROC GLH_EXT_NAME(glWindowPos3dvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS3FVARBPROC GLH_EXT_NAME(glWindowPos3fvARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS3IVARBPROC GLH_EXT_NAME(glWindowPos3ivARB) GLH_INITIALIZER; + GLH_EXTERN PFNGLWINDOWPOS3SVARBPROC GLH_EXT_NAME(glWindowPos3svARB) GLH_INITIALIZER; +#endif + +#ifdef GL_EXT_abgr +#endif + +#ifdef GL_EXT_bgra +#endif + +#ifdef GL_EXT_blend_color + GLH_EXTERN PFNGLBLENDCOLOREXTPROC GLH_EXT_NAME(glBlendColorEXT) GLH_INITIALIZER; +#endif + +#ifdef GL_EXT_blend_func_separate + GLH_EXTERN PFNGLBLENDFUNCSEPARATEEXTPROC GLH_EXT_NAME(glBlendFuncSeparateEXT) GLH_INITIALIZER; +#endif + +#ifdef GL_EXT_blend_minmax + GLH_EXTERN PFNGLBLENDEQUATIONEXTPROC GLH_EXT_NAME(glBlendEquationEXT) GLH_INITIALIZER; +#endif + +#ifdef GL_EXT_blend_subtract +#endif + +#ifdef GL_EXT_compiled_vertex_array + GLH_EXTERN PFNGLLOCKARRAYSEXTPROC GLH_EXT_NAME(glLockArraysEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLUNLOCKARRAYSEXTPROC GLH_EXT_NAME(glUnlockArraysEXT) GLH_INITIALIZER; +#endif + +#ifdef GL_EXT_draw_range_elements +#endif + +#ifdef GL_EXT_fog_coord + GLH_EXTERN PFNGLFOGCOORDDEXTPROC GLH_EXT_NAME(glFogCoorddEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLFOGCOORDDVEXTPROC GLH_EXT_NAME(glFogCoorddvEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLFOGCOORDFEXTPROC GLH_EXT_NAME(glFogCoordfEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLFOGCOORDFVEXTPROC GLH_EXT_NAME(glFogCoordfvEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLFOGCOORDPOINTEREXTPROC GLH_EXT_NAME(glFogCoordPointerEXT) GLH_INITIALIZER; +#endif + +#ifdef GL_EXT_multi_draw_arrays + GLH_EXTERN PFNGLMULTIDRAWARRAYSEXTPROC GLH_EXT_NAME(glMultiDrawArraysEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTIDRAWELEMENTSEXTPROC GLH_EXT_NAME(glMultiDrawElementsEXT) GLH_INITIALIZER; +#endif + +#ifdef GL_EXT_light_max_exponent +#endif + +#ifdef GL_EXT_packed_pixels +#endif + +#ifdef GL_EXT_paletted_texture + GLH_EXTERN PFNGLCOLORSUBTABLEEXTPROC GLH_EXT_NAME(glColorSubTableEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOLORTABLEEXTPROC GLH_EXT_NAME(glColorTableEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETCOLORTABLEEXTPROC GLH_EXT_NAME(glGetColorTableEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETCOLORTABLEPARAMETERFVEXTPROC GLH_EXT_NAME(glGetColorTableParameterfvEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETCOLORTABLEPARAMETERIVEXTPROC GLH_EXT_NAME(glGetColorTableParameterivEXT) GLH_INITIALIZER; +#endif + +#ifdef GL_EXT_point_parameters + GLH_EXTERN PFNGLPOINTPARAMETERFEXTPROC GLH_EXT_NAME(glPointParameterfEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLPOINTPARAMETERFVEXTPROC GLH_EXT_NAME(glPointParameterfvEXT) GLH_INITIALIZER; +#endif + +#ifdef GL_EXT_rescale_normal +#endif + +#ifdef GL_EXT_secondary_color + GLH_EXTERN PFNGLSECONDARYCOLOR3BEXTPROC GLH_EXT_NAME(glSecondaryColor3bEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3BVEXTPROC GLH_EXT_NAME(glSecondaryColor3bvEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3DEXTPROC GLH_EXT_NAME(glSecondaryColor3dEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3DVEXTPROC GLH_EXT_NAME(glSecondaryColor3dvEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3FEXTPROC GLH_EXT_NAME(glSecondaryColor3fEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3FVEXTPROC GLH_EXT_NAME(glSecondaryColor3fvEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3IEXTPROC GLH_EXT_NAME(glSecondaryColor3iEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3IVEXTPROC GLH_EXT_NAME(glSecondaryColor3ivEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3SEXTPROC GLH_EXT_NAME(glSecondaryColor3sEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3SVEXTPROC GLH_EXT_NAME(glSecondaryColor3svEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3UBEXTPROC GLH_EXT_NAME(glSecondaryColor3ubEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3UBVEXTPROC GLH_EXT_NAME(glSecondaryColor3ubvEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3UIEXTPROC GLH_EXT_NAME(glSecondaryColor3uiEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3UIVEXTPROC GLH_EXT_NAME(glSecondaryColor3uivEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3USEXTPROC GLH_EXT_NAME(glSecondaryColor3usEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3USVEXTPROC GLH_EXT_NAME(glSecondaryColor3usvEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLORPOINTEREXTPROC GLH_EXT_NAME(glSecondaryColorPointerEXT) GLH_INITIALIZER; +#endif + +#ifdef GL_EXT_separate_specular_color +#endif + +#ifdef GL_EXT_shadow_funcs +#endif + +#ifdef GL_EXT_shared_texture_palette +#endif + +#ifdef GL_EXT_stencil_two_side + GLH_EXTERN PFNGLACTIVESTENCILFACEEXTPROC GLH_EXT_NAME(glActiveStencilFaceEXT) GLH_INITIALIZER; +#endif + +#ifdef GL_EXT_stencil_wrap +#endif + +#ifdef GL_EXT_texture_compression_s3tc +#endif + +#ifdef GL_EXT_texture_cube_map +#endif + +#ifdef GL_EXT_texture_edge_clamp +#endif + +#ifdef GL_EXT_texture_env_add +#endif + +#ifdef GL_EXT_texture_env_combine +#endif + +#ifdef GL_EXT_texture_env_dot3 +#endif + +#ifdef GL_EXT_texture_filter_anisotropic +#endif + +#ifdef GL_EXT_texture_lod_bias +#endif + +#ifdef GL_EXT_texture_object + GLH_EXTERN PFNGLARETEXTURESRESIDENTEXTPROC GLH_EXT_NAME(glAreTexturesResidentEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLBINDTEXTUREEXTPROC GLH_EXT_NAME(glBindTextureEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLDELETETEXTURESEXTPROC GLH_EXT_NAME(glDeleteTexturesEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLGENTEXTURESEXTPROC GLH_EXT_NAME(glGenTexturesEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLISTEXTUREEXTPROC GLH_EXT_NAME(glIsTextureEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLPRIORITIZETEXTURESEXTPROC GLH_EXT_NAME(glPrioritizeTexturesEXT) GLH_INITIALIZER; +#endif + +#ifdef GL_EXT_texture_rectangle +#endif + +#ifdef GL_EXT_texture3D + GLH_EXTERN PFNGLTEXIMAGE3DEXTPROC GLH_EXT_NAME(glTexImage3DEXT) GLH_INITIALIZER; +#endif + +#ifdef GL_EXT_vertex_array + GLH_EXTERN PFNGLARRAYELEMENTEXTPROC GLH_EXT_NAME(glArrayElementEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOLORPOINTEREXTPROC GLH_EXT_NAME(glColorPointerEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLEDGEFLAGPOINTEREXTPROC GLH_EXT_NAME(glEdgeFlagPointerEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETPOINTERVEXTPROC GLH_EXT_NAME(glGetPointervEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLINDEXPOINTEREXTPROC GLH_EXT_NAME(glIndexPointerEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLNORMALPOINTEREXTPROC GLH_EXT_NAME(glNormalPointerEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLTEXCOORDPOINTEREXTPROC GLH_EXT_NAME(glTexCoordPointerEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXPOINTEREXTPROC GLH_EXT_NAME(glVertexPointerEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLDRAWARRAYSEXTPROC GLH_EXT_NAME(glDrawArraysEXT) GLH_INITIALIZER; +#endif + +#ifdef GL_EXT_vertex_weighting + GLH_EXTERN PFNGLVERTEXWEIGHTFEXTPROC GLH_EXT_NAME(glVertexWeightfEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXWEIGHTFVEXTPROC GLH_EXT_NAME(glVertexWeightfvEXT) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXWEIGHTPOINTEREXTPROC GLH_EXT_NAME(glVertexWeightPointerEXT) GLH_INITIALIZER; +#endif + +#ifdef GL_HP_occlusion_test +#endif + +#ifdef GL_IBM_texture_mirrored_repeat +#endif + +#ifdef GL_NV_blend_square +#endif + +#ifdef GL_NV_copy_depth_to_color +#endif + +#ifdef GL_NV_depth_clamp +#endif + +#ifdef GL_NV_element_array + GLH_EXTERN PFNGLELEMENTPOINTERNVPROC GLH_EXT_NAME(glElementPointerNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLDRAWELEMENTARRAYNVPROC GLH_EXT_NAME(glDrawElementArrayNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLDRAWRANGEELEMENTARRAYNVPROC GLH_EXT_NAME(glDrawRangeElementArrayNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTIDRAWELEMENTARRAYNVPROC GLH_EXT_NAME(glMultiDrawElementArrayNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTIDRAWRANGEELEMENTARRAYNVPROC GLH_EXT_NAME(glMultiDrawRangeElementArrayNV) GLH_INITIALIZER; +#endif + +#ifdef GL_NV_fence + GLH_EXTERN PFNGLGENFENCESNVPROC GLH_EXT_NAME(glGenFencesNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLDELETEFENCESNVPROC GLH_EXT_NAME(glDeleteFencesNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLSETFENCENVPROC GLH_EXT_NAME(glSetFenceNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLTESTFENCENVPROC GLH_EXT_NAME(glTestFenceNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLFINISHFENCENVPROC GLH_EXT_NAME(glFinishFenceNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLISFENCENVPROC GLH_EXT_NAME(glIsFenceNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETFENCEIVNVPROC GLH_EXT_NAME(glGetFenceivNV) GLH_INITIALIZER; +#endif + +#ifdef GL_NV_float_buffer +#endif + +#ifdef GL_NV_fog_distance +#endif + +#ifdef GL_NV_fragment_program + GLH_EXTERN PFNGLPROGRAMNAMEDPARAMETER4FNVPROC GLH_EXT_NAME(glProgramNamedParameter4fNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLPROGRAMNAMEDPARAMETER4DNVPROC GLH_EXT_NAME(glProgramNamedParameter4dNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC GLH_EXT_NAME(glProgramNamedParameter4fvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC GLH_EXT_NAME(glProgramNamedParameter4dvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC GLH_EXT_NAME(glGetProgramNamedParameterfvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC GLH_EXT_NAME(glGetProgramNamedParameterdvNV) GLH_INITIALIZER; +#endif + +#ifdef GL_NV_half_float + GLH_EXTERN PFNGLVERTEX2HNVPROC GLH_EXT_NAME(glVertex2hNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEX2HVNVPROC GLH_EXT_NAME(glVertex2hvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEX3HNVPROC GLH_EXT_NAME(glVertex3hNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEX3HVNVPROC GLH_EXT_NAME(glVertex3hvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEX4HNVPROC GLH_EXT_NAME(glVertex4hNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEX4HVNVPROC GLH_EXT_NAME(glVertex4hvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLNORMAL3HNVPROC GLH_EXT_NAME(glNormal3hNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLNORMAL3HVNVPROC GLH_EXT_NAME(glNormal3hvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOLOR3HNVPROC GLH_EXT_NAME(glColor3hNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOLOR3HVNVPROC GLH_EXT_NAME(glColor3hvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOLOR4HNVPROC GLH_EXT_NAME(glColor4hNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOLOR4HVNVPROC GLH_EXT_NAME(glColor4hvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLTEXCOORD1HNVPROC GLH_EXT_NAME(glTexCoord1hNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLTEXCOORD1HVNVPROC GLH_EXT_NAME(glTexCoord1hvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLTEXCOORD2HNVPROC GLH_EXT_NAME(glTexCoord2hNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLTEXCOORD2HVNVPROC GLH_EXT_NAME(glTexCoord2hvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLTEXCOORD3HNVPROC GLH_EXT_NAME(glTexCoord3hNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLTEXCOORD3HVNVPROC GLH_EXT_NAME(glTexCoord3hvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLTEXCOORD4HNVPROC GLH_EXT_NAME(glTexCoord4hNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLTEXCOORD4HVNVPROC GLH_EXT_NAME(glTexCoord4hvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD1HNVPROC GLH_EXT_NAME(glMultiTexCoord1hNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD1HVNVPROC GLH_EXT_NAME(glMultiTexCoord1hvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD2HNVPROC GLH_EXT_NAME(glMultiTexCoord2hNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD2HVNVPROC GLH_EXT_NAME(glMultiTexCoord2hvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD3HNVPROC GLH_EXT_NAME(glMultiTexCoord3hNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD3HVNVPROC GLH_EXT_NAME(glMultiTexCoord3hvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD4HNVPROC GLH_EXT_NAME(glMultiTexCoord4hNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLMULTITEXCOORD4HVNVPROC GLH_EXT_NAME(glMultiTexCoord4hvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLFOGCOORDHNVPROC GLH_EXT_NAME(glFogCoordhNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLFOGCOORDHVNVPROC GLH_EXT_NAME(glFogCoordhvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3HNVPROC GLH_EXT_NAME(glSecondaryColor3hNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLSECONDARYCOLOR3HVNVPROC GLH_EXT_NAME(glSecondaryColor3hvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXWEIGHTHNVPROC GLH_EXT_NAME(glVertexWeighthNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXWEIGHTHVNVPROC GLH_EXT_NAME(glVertexWeighthvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB1HNVPROC GLH_EXT_NAME(glVertexAttrib1hNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB1HVNVPROC GLH_EXT_NAME(glVertexAttrib1hvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB2HNVPROC GLH_EXT_NAME(glVertexAttrib2hNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB2HVNVPROC GLH_EXT_NAME(glVertexAttrib2hvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB3HNVPROC GLH_EXT_NAME(glVertexAttrib3hNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB3HVNVPROC GLH_EXT_NAME(glVertexAttrib3hvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4HNVPROC GLH_EXT_NAME(glVertexAttrib4hNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4HVNVPROC GLH_EXT_NAME(glVertexAttrib4hvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIBS1HVNVPROC GLH_EXT_NAME(glVertexAttribs1hvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIBS2HVNVPROC GLH_EXT_NAME(glVertexAttribs2hvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIBS3HVNVPROC GLH_EXT_NAME(glVertexAttribs3hvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIBS4HVNVPROC GLH_EXT_NAME(glVertexAttribs4hvNV) GLH_INITIALIZER; +#endif + +#ifdef GL_NV_light_max_exponent +#endif + +#ifdef GL_NV_multisample_filter_hint +#endif + +#ifdef GL_NV_occlusion_query + GLH_EXTERN PFNGLGENOCCLUSIONQUERIESNVPROC GLH_EXT_NAME(glGenOcclusionQueriesNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLDELETEOCCLUSIONQUERIESNVPROC GLH_EXT_NAME(glDeleteOcclusionQueriesNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLISOCCLUSIONQUERYNVPROC GLH_EXT_NAME(glIsOcclusionQueryNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLBEGINOCCLUSIONQUERYNVPROC GLH_EXT_NAME(glBeginOcclusionQueryNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLENDOCCLUSIONQUERYNVPROC GLH_EXT_NAME(glEndOcclusionQueryNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETOCCLUSIONQUERYIVNVPROC GLH_EXT_NAME(glGetOcclusionQueryivNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETOCCLUSIONQUERYUIVNVPROC GLH_EXT_NAME(glGetOcclusionQueryuivNV) GLH_INITIALIZER; +#endif + +#ifdef GL_NV_packed_depth_stencil +#endif + +#ifdef GL_NV_pixel_data_range + GLH_EXTERN PFNGLPIXELDATARANGENVPROC GLH_EXT_NAME(glPixelDataRangeNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLFLUSHPIXELDATARANGENVPROC GLH_EXT_NAME(glFlushPixelDataRangeNV) GLH_INITIALIZER; +#endif + +#ifdef GL_NV_point_sprite + GLH_EXTERN PFNGLPOINTPARAMETERINVPROC GLH_EXT_NAME(glPointParameteriNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLPOINTPARAMETERIVNVPROC GLH_EXT_NAME(glPointParameterivNV) GLH_INITIALIZER; +#endif + +#ifdef GL_NV_primitive_restart + GLH_EXTERN PFNGLPRIMITIVERESTARTNVPROC GLH_EXT_NAME(glPrimitiveRestartNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLPRIMITIVERESTARTINDEXNVPROC GLH_EXT_NAME(glPrimitiveRestartIndexNV) GLH_INITIALIZER; +#endif + +#ifdef GL_NV_register_combiners + GLH_EXTERN PFNGLCOMBINERPARAMETERFVNVPROC GLH_EXT_NAME(glCombinerParameterfvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOMBINERPARAMETERFNVPROC GLH_EXT_NAME(glCombinerParameterfNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOMBINERPARAMETERIVNVPROC GLH_EXT_NAME(glCombinerParameterivNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOMBINERPARAMETERINVPROC GLH_EXT_NAME(glCombinerParameteriNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOMBINERINPUTNVPROC GLH_EXT_NAME(glCombinerInputNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLCOMBINEROUTPUTNVPROC GLH_EXT_NAME(glCombinerOutputNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLFINALCOMBINERINPUTNVPROC GLH_EXT_NAME(glFinalCombinerInputNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC GLH_EXT_NAME(glGetCombinerInputParameterfvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC GLH_EXT_NAME(glGetCombinerInputParameterivNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC GLH_EXT_NAME(glGetCombinerOutputParameterfvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC GLH_EXT_NAME(glGetCombinerOutputParameterivNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC GLH_EXT_NAME(glGetFinalCombinerInputParameterfvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC GLH_EXT_NAME(glGetFinalCombinerInputParameterivNV) GLH_INITIALIZER; +#endif + +#ifdef GL_NV_register_combiners2 + GLH_EXTERN PFNGLCOMBINERSTAGEPARAMETERFVNVPROC GLH_EXT_NAME(glCombinerStageParameterfvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC GLH_EXT_NAME(glGetCombinerStageParameterfvNV) GLH_INITIALIZER; +#endif + +#ifdef GL_NV_stencil_two_side + GLH_EXTERN PFNGLACTIVESTENCILFACENVPROC GLH_EXT_NAME(glActiveStencilFaceNV) GLH_INITIALIZER; +#endif + +#ifdef GL_NV_texgen_reflection +#endif + +#ifdef GL_NV_texture_compression_vtc +#endif + +#ifdef GL_NV_texture_env_combine4 +#endif + +#ifdef GL_NV_texture_rectangle +#endif + +#ifdef GL_NV_texture_shader +#endif + +#ifdef GL_NV_texture_shader2 +#endif + +#ifdef GL_NV_texture_shader3 +#endif + +#ifdef GL_NV_vertex_array_range + GLH_EXTERN PFNGLFLUSHVERTEXARRAYRANGENVPROC GLH_EXT_NAME(glFlushVertexArrayRangeNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXARRAYRANGENVPROC GLH_EXT_NAME(glVertexArrayRangeNV) GLH_INITIALIZER; +# ifdef _WIN32 + GLH_EXTERN PFNWGLALLOCATEMEMORYNVPROC GLH_EXT_NAME(wglAllocateMemoryNV) GLH_INITIALIZER; +# endif +# ifdef GLX_VERSION_1_3 + GLH_EXTERN PFNGLXALLOCATEMEMORYNVPROC GLH_EXT_NAME(glXAllocateMemoryNV) GLH_INITIALIZER; +# endif +# ifdef _WIN32 + GLH_EXTERN PFNWGLFREEMEMORYNVPROC GLH_EXT_NAME(wglFreeMemoryNV) GLH_INITIALIZER; +# endif +# ifdef GLX_VERSION_1_3 + GLH_EXTERN PFNGLXFREEMEMORYNVPROC GLH_EXT_NAME(glXFreeMemoryNV) GLH_INITIALIZER; +# endif +#endif + +#ifdef GL_NV_vertex_array_range2 +#endif + +#ifdef GL_NV_vertex_program + GLH_EXTERN PFNGLAREPROGRAMSRESIDENTNVPROC GLH_EXT_NAME(glAreProgramsResidentNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLBINDPROGRAMNVPROC GLH_EXT_NAME(glBindProgramNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLDELETEPROGRAMSNVPROC GLH_EXT_NAME(glDeleteProgramsNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLEXECUTEPROGRAMNVPROC GLH_EXT_NAME(glExecuteProgramNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLGENPROGRAMSNVPROC GLH_EXT_NAME(glGenProgramsNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETPROGRAMPARAMETERDVNVPROC GLH_EXT_NAME(glGetProgramParameterdvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETPROGRAMPARAMETERFVNVPROC GLH_EXT_NAME(glGetProgramParameterfvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETPROGRAMIVNVPROC GLH_EXT_NAME(glGetProgramivNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETPROGRAMSTRINGNVPROC GLH_EXT_NAME(glGetProgramStringNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETTRACKMATRIXIVNVPROC GLH_EXT_NAME(glGetTrackMatrixivNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETVERTEXATTRIBDVNVPROC GLH_EXT_NAME(glGetVertexAttribdvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETVERTEXATTRIBFVNVPROC GLH_EXT_NAME(glGetVertexAttribfvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETVERTEXATTRIBIVNVPROC GLH_EXT_NAME(glGetVertexAttribivNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLGETVERTEXATTRIBPOINTERVNVPROC GLH_EXT_NAME(glGetVertexAttribPointervNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLISPROGRAMNVPROC GLH_EXT_NAME(glIsProgramNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLLOADPROGRAMNVPROC GLH_EXT_NAME(glLoadProgramNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLPROGRAMPARAMETER4DNVPROC GLH_EXT_NAME(glProgramParameter4dNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLPROGRAMPARAMETER4DVNVPROC GLH_EXT_NAME(glProgramParameter4dvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLPROGRAMPARAMETER4FNVPROC GLH_EXT_NAME(glProgramParameter4fNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLPROGRAMPARAMETER4FVNVPROC GLH_EXT_NAME(glProgramParameter4fvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLPROGRAMPARAMETERS4DVNVPROC GLH_EXT_NAME(glProgramParameters4dvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLPROGRAMPARAMETERS4FVNVPROC GLH_EXT_NAME(glProgramParameters4fvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLREQUESTRESIDENTPROGRAMSNVPROC GLH_EXT_NAME(glRequestResidentProgramsNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLTRACKMATRIXNVPROC GLH_EXT_NAME(glTrackMatrixNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIBPOINTERNVPROC GLH_EXT_NAME(glVertexAttribPointerNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB1DNVPROC GLH_EXT_NAME(glVertexAttrib1dNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB1DVNVPROC GLH_EXT_NAME(glVertexAttrib1dvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB1FNVPROC GLH_EXT_NAME(glVertexAttrib1fNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB1FVNVPROC GLH_EXT_NAME(glVertexAttrib1fvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB1SNVPROC GLH_EXT_NAME(glVertexAttrib1sNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB1SVNVPROC GLH_EXT_NAME(glVertexAttrib1svNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB2DNVPROC GLH_EXT_NAME(glVertexAttrib2dNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB2DVNVPROC GLH_EXT_NAME(glVertexAttrib2dvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB2FNVPROC GLH_EXT_NAME(glVertexAttrib2fNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB2FVNVPROC GLH_EXT_NAME(glVertexAttrib2fvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB2SNVPROC GLH_EXT_NAME(glVertexAttrib2sNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB2SVNVPROC GLH_EXT_NAME(glVertexAttrib2svNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB3DNVPROC GLH_EXT_NAME(glVertexAttrib3dNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB3DVNVPROC GLH_EXT_NAME(glVertexAttrib3dvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB3FNVPROC GLH_EXT_NAME(glVertexAttrib3fNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB3FVNVPROC GLH_EXT_NAME(glVertexAttrib3fvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB3SNVPROC GLH_EXT_NAME(glVertexAttrib3sNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB3SVNVPROC GLH_EXT_NAME(glVertexAttrib3svNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4DNVPROC GLH_EXT_NAME(glVertexAttrib4dNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4DVNVPROC GLH_EXT_NAME(glVertexAttrib4dvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4FNVPROC GLH_EXT_NAME(glVertexAttrib4fNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4FVNVPROC GLH_EXT_NAME(glVertexAttrib4fvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4SNVPROC GLH_EXT_NAME(glVertexAttrib4sNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4SVNVPROC GLH_EXT_NAME(glVertexAttrib4svNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIB4UBVNVPROC GLH_EXT_NAME(glVertexAttrib4ubvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIBS1DVNVPROC GLH_EXT_NAME(glVertexAttribs1dvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIBS1FVNVPROC GLH_EXT_NAME(glVertexAttribs1fvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIBS1SVNVPROC GLH_EXT_NAME(glVertexAttribs1svNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIBS2DVNVPROC GLH_EXT_NAME(glVertexAttribs2dvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIBS2FVNVPROC GLH_EXT_NAME(glVertexAttribs2fvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIBS2SVNVPROC GLH_EXT_NAME(glVertexAttribs2svNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIBS3DVNVPROC GLH_EXT_NAME(glVertexAttribs3dvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIBS3FVNVPROC GLH_EXT_NAME(glVertexAttribs3fvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIBS3SVNVPROC GLH_EXT_NAME(glVertexAttribs3svNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIBS4DVNVPROC GLH_EXT_NAME(glVertexAttribs4dvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIBS4FVNVPROC GLH_EXT_NAME(glVertexAttribs4fvNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIBS4SVNVPROC GLH_EXT_NAME(glVertexAttribs4svNV) GLH_INITIALIZER; + GLH_EXTERN PFNGLVERTEXATTRIBS4UBVNVPROC GLH_EXT_NAME(glVertexAttribs4ubvNV) GLH_INITIALIZER; +#endif + +#ifdef GL_NV_vertex_program1_1 +#endif + +#ifdef GL_NV_vertex_program2 +#endif + +#ifdef GL_SGIS_generate_mipmap +#endif + +#ifdef GL_SGIS_texture_lod +#endif + +#ifdef GL_SGIX_depth_texture +#endif + +#ifdef GL_SGIX_shadow +#endif + +#ifdef GL_WIN_swap_hint + GLH_EXTERN PFNGLADDSWAPHINTRECTWINPROC GLH_EXT_NAME(glAddSwapHintRectWIN) GLH_INITIALIZER; +#endif + +#ifdef WGL_ARB_buffer_region +# ifdef _WIN32 + GLH_EXTERN PFNWGLCREATEBUFFERREGIONARBPROC GLH_EXT_NAME(wglCreateBufferRegionARB) GLH_INITIALIZER; +# endif +# ifdef _WIN32 + GLH_EXTERN PFNWGLDELETEBUFFERREGIONARBPROC GLH_EXT_NAME(wglDeleteBufferRegionARB) GLH_INITIALIZER; +# endif +# ifdef _WIN32 + GLH_EXTERN PFNWGLSAVEBUFFERREGIONARBPROC GLH_EXT_NAME(wglSaveBufferRegionARB) GLH_INITIALIZER; +# endif +# ifdef _WIN32 + GLH_EXTERN PFNWGLRESTOREBUFFERREGIONARBPROC GLH_EXT_NAME(wglRestoreBufferRegionARB) GLH_INITIALIZER; +# endif +#endif + +#ifdef WGL_ARB_extensions_string +# ifdef _WIN32 + GLH_EXTERN PFNWGLGETEXTENSIONSSTRINGARBPROC GLH_EXT_NAME(wglGetExtensionsStringARB) GLH_INITIALIZER; +# endif +#endif + +#ifdef WGL_ARB_pbuffer +# ifdef _WIN32 + GLH_EXTERN PFNWGLCREATEPBUFFERARBPROC GLH_EXT_NAME(wglCreatePbufferARB) GLH_INITIALIZER; +# endif +# ifdef _WIN32 + GLH_EXTERN PFNWGLGETPBUFFERDCARBPROC GLH_EXT_NAME(wglGetPbufferDCARB) GLH_INITIALIZER; +# endif +# ifdef _WIN32 + GLH_EXTERN PFNWGLRELEASEPBUFFERDCARBPROC GLH_EXT_NAME(wglReleasePbufferDCARB) GLH_INITIALIZER; +# endif +# ifdef _WIN32 + GLH_EXTERN PFNWGLDESTROYPBUFFERARBPROC GLH_EXT_NAME(wglDestroyPbufferARB) GLH_INITIALIZER; +# endif +# ifdef _WIN32 + GLH_EXTERN PFNWGLQUERYPBUFFERARBPROC GLH_EXT_NAME(wglQueryPbufferARB) GLH_INITIALIZER; +# endif +#endif + +#ifdef WGL_ARB_pixel_format +# ifdef _WIN32 + GLH_EXTERN PFNWGLGETPIXELFORMATATTRIBIVARBPROC GLH_EXT_NAME(wglGetPixelFormatAttribivARB) GLH_INITIALIZER; +# endif +# ifdef _WIN32 + GLH_EXTERN PFNWGLGETPIXELFORMATATTRIBFVARBPROC GLH_EXT_NAME(wglGetPixelFormatAttribfvARB) GLH_INITIALIZER; +# endif +# ifdef _WIN32 + GLH_EXTERN PFNWGLCHOOSEPIXELFORMATARBPROC GLH_EXT_NAME(wglChoosePixelFormatARB) GLH_INITIALIZER; +# endif +#endif + +#ifdef WGL_ARB_render_texture +# ifdef _WIN32 + GLH_EXTERN PFNWGLBINDTEXIMAGEARBPROC GLH_EXT_NAME(wglBindTexImageARB) GLH_INITIALIZER; +# endif +# ifdef _WIN32 + GLH_EXTERN PFNWGLRELEASETEXIMAGEARBPROC GLH_EXT_NAME(wglReleaseTexImageARB) GLH_INITIALIZER; +# endif +# ifdef _WIN32 + GLH_EXTERN PFNWGLSETPBUFFERATTRIBARBPROC GLH_EXT_NAME(wglSetPbufferAttribARB) GLH_INITIALIZER; +# endif +#endif + +#ifdef WGL_EXT_extensions_string +# ifdef _WIN32 + GLH_EXTERN PFNWGLGETEXTENSIONSSTRINGEXTPROC GLH_EXT_NAME(wglGetExtensionsStringEXT) GLH_INITIALIZER; +# endif +#endif + +#ifdef WGL_EXT_swap_control +# ifdef _WIN32 + GLH_EXTERN PFNWGLSWAPINTERVALEXTPROC GLH_EXT_NAME(wglSwapIntervalEXT) GLH_INITIALIZER; +# endif +# ifdef _WIN32 + GLH_EXTERN PFNWGLGETSWAPINTERVALEXTPROC GLH_EXT_NAME(wglGetSwapIntervalEXT) GLH_INITIALIZER; +# endif +#endif + +#ifdef WGL_NV_float_buffer +#endif + +#ifdef WGL_NV_render_depth_texture +#endif + +#ifdef WGL_NV_render_texture_rectangle +#endif + +#ifdef GLX_SGIX_pbuffer +# ifdef GLX_VERSION_1_3 + GLH_EXTERN PFNGLXCREATEGLXPBUFFERSGIXPROC GLH_EXT_NAME(glXCreateGLXPbufferSGIX) GLH_INITIALIZER; +# endif +# ifdef GLX_VERSION_1_3 + GLH_EXTERN PFNGLXDESTROYGLXPBUFFERSGIXPROC GLH_EXT_NAME(glXDestroyGLXPbufferSGIX) GLH_INITIALIZER; +# endif +# ifdef GLX_VERSION_1_3 + GLH_EXTERN PFNGLXQUERYGLXPBUFFERSGIXPROC GLH_EXT_NAME(glXQueryGLXPbufferSGIX) GLH_INITIALIZER; +# endif +# ifdef GLX_VERSION_1_3 + GLH_EXTERN PFNGLXSELECTEVENTSGIXPROC GLH_EXT_NAME(glXSelectEventSGIX) GLH_INITIALIZER; +# endif +# ifdef GLX_VERSION_1_3 + GLH_EXTERN PFNGLXGETSELECTEDEVENTSGIXPROC GLH_EXT_NAME(glXGetSelectedEventSGIX) GLH_INITIALIZER; +# endif +#endif + +#ifdef GLX_SGIX_fbconfig +# ifdef GLX_VERSION_1_3 + GLH_EXTERN PFNGLXGETFBCONFIGATTRIBSGIXPROC GLH_EXT_NAME(glXGetFBConfigAttribSGIX) GLH_INITIALIZER; +# endif +# ifdef GLX_VERSION_1_3 + GLH_EXTERN PFNGLXCHOOSEFBCONFIGSGIXPROC GLH_EXT_NAME(glXChooseFBConfigSGIX) GLH_INITIALIZER; +# endif +# ifdef GLX_VERSION_1_3 + GLH_EXTERN PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC GLH_EXT_NAME(glXCreateGLXPixmapWithConfigSGIX) GLH_INITIALIZER; +# endif +# ifdef GLX_VERSION_1_3 + GLH_EXTERN PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC GLH_EXT_NAME(glXCreateContextWithConfigSGIX) GLH_INITIALIZER; +# endif +# ifdef GLX_VERSION_1_3 + GLH_EXTERN PFNGLXGETVISUALFROMFBCONFIGSGIXPROC GLH_EXT_NAME(glXGetVisualFromFBConfigSGIX) GLH_INITIALIZER; +# endif +# ifdef GLX_VERSION_1_3 + GLH_EXTERN PFNGLXGETFBCONFIGFROMVISUALSGIXPROC GLH_EXT_NAME(glXGetFBConfigFromVisualSGIX) GLH_INITIALIZER; +# endif +#endif + + +#ifdef GLH_EXT_SINGLE_FILE + +int glh_init_extension(const char* extension) +{ + if (NULL == extension) { + return GL_FALSE; +#ifndef _WIN32 + }else if (0 == strcmp (extension, "GL_ARB_multitexture") || 0 == strcmp (extension, "GL_VERSION_1_2")) { + return GL_TRUE; +#endif +#ifdef _WIN32 +#ifdef GL_VERSION_1_2 + } else if (0 == strcmp(extension, "GL_VERSION_1_2")) { + GLH_CORE_1_2_NAME(glBlendColor) = (PFNGLBLENDCOLORPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendColor"); + if (NULL == GLH_CORE_1_2_NAME(glBlendColor)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glBlendEquation) = (PFNGLBLENDEQUATIONPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendEquation"); + if (NULL == GLH_CORE_1_2_NAME(glBlendEquation)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glDrawRangeElements) = (PFNGLDRAWRANGEELEMENTSPROC)GLH_EXT_GET_PROC_ADDRESS("glDrawRangeElements"); + if (NULL == GLH_CORE_1_2_NAME(glDrawRangeElements)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glColorTable) = (PFNGLCOLORTABLEPROC)GLH_EXT_GET_PROC_ADDRESS("glColorTable"); + if (NULL == GLH_CORE_1_2_NAME(glColorTable)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glColorTableParameterfv) = (PFNGLCOLORTABLEPARAMETERFVPROC)GLH_EXT_GET_PROC_ADDRESS("glColorTableParameterfv"); + if (NULL == GLH_CORE_1_2_NAME(glColorTableParameterfv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glColorTableParameteriv) = (PFNGLCOLORTABLEPARAMETERIVPROC)GLH_EXT_GET_PROC_ADDRESS("glColorTableParameteriv"); + if (NULL == GLH_CORE_1_2_NAME(glColorTableParameteriv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glCopyColorTable) = (PFNGLCOPYCOLORTABLEPROC)GLH_EXT_GET_PROC_ADDRESS("glCopyColorTable"); + if (NULL == GLH_CORE_1_2_NAME(glCopyColorTable)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glGetColorTable) = (PFNGLGETCOLORTABLEPROC)GLH_EXT_GET_PROC_ADDRESS("glGetColorTable"); + if (NULL == GLH_CORE_1_2_NAME(glGetColorTable)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glGetColorTableParameterfv) = (PFNGLGETCOLORTABLEPARAMETERFVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetColorTableParameterfv"); + if (NULL == GLH_CORE_1_2_NAME(glGetColorTableParameterfv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glGetColorTableParameteriv) = (PFNGLGETCOLORTABLEPARAMETERIVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetColorTableParameteriv"); + if (NULL == GLH_CORE_1_2_NAME(glGetColorTableParameteriv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glColorSubTable) = (PFNGLCOLORSUBTABLEPROC)GLH_EXT_GET_PROC_ADDRESS("glColorSubTable"); + if (NULL == GLH_CORE_1_2_NAME(glColorSubTable)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glCopyColorSubTable) = (PFNGLCOPYCOLORSUBTABLEPROC)GLH_EXT_GET_PROC_ADDRESS("glCopyColorSubTable"); + if (NULL == GLH_CORE_1_2_NAME(glCopyColorSubTable)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glConvolutionFilter1D) = (PFNGLCONVOLUTIONFILTER1DPROC)GLH_EXT_GET_PROC_ADDRESS("glConvolutionFilter1D"); + if (NULL == GLH_CORE_1_2_NAME(glConvolutionFilter1D)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glConvolutionFilter2D) = (PFNGLCONVOLUTIONFILTER2DPROC)GLH_EXT_GET_PROC_ADDRESS("glConvolutionFilter2D"); + if (NULL == GLH_CORE_1_2_NAME(glConvolutionFilter2D)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glConvolutionParameterf) = (PFNGLCONVOLUTIONPARAMETERFPROC)GLH_EXT_GET_PROC_ADDRESS("glConvolutionParameterf"); + if (NULL == GLH_CORE_1_2_NAME(glConvolutionParameterf)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glConvolutionParameterfv) = (PFNGLCONVOLUTIONPARAMETERFVPROC)GLH_EXT_GET_PROC_ADDRESS("glConvolutionParameterfv"); + if (NULL == GLH_CORE_1_2_NAME(glConvolutionParameterfv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glConvolutionParameteri) = (PFNGLCONVOLUTIONPARAMETERIPROC)GLH_EXT_GET_PROC_ADDRESS("glConvolutionParameteri"); + if (NULL == GLH_CORE_1_2_NAME(glConvolutionParameteri)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glConvolutionParameteriv) = (PFNGLCONVOLUTIONPARAMETERIVPROC)GLH_EXT_GET_PROC_ADDRESS("glConvolutionParameteriv"); + if (NULL == GLH_CORE_1_2_NAME(glConvolutionParameteriv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glCopyConvolutionFilter1D) = (PFNGLCOPYCONVOLUTIONFILTER1DPROC)GLH_EXT_GET_PROC_ADDRESS("glCopyConvolutionFilter1D"); + if (NULL == GLH_CORE_1_2_NAME(glCopyConvolutionFilter1D)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glCopyConvolutionFilter2D) = (PFNGLCOPYCONVOLUTIONFILTER2DPROC)GLH_EXT_GET_PROC_ADDRESS("glCopyConvolutionFilter2D"); + if (NULL == GLH_CORE_1_2_NAME(glCopyConvolutionFilter2D)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glGetConvolutionFilter) = (PFNGLGETCONVOLUTIONFILTERPROC)GLH_EXT_GET_PROC_ADDRESS("glGetConvolutionFilter"); + if (NULL == GLH_CORE_1_2_NAME(glGetConvolutionFilter)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glGetConvolutionParameterfv) = (PFNGLGETCONVOLUTIONPARAMETERFVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetConvolutionParameterfv"); + if (NULL == GLH_CORE_1_2_NAME(glGetConvolutionParameterfv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glGetConvolutionParameteriv) = (PFNGLGETCONVOLUTIONPARAMETERIVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetConvolutionParameteriv"); + if (NULL == GLH_CORE_1_2_NAME(glGetConvolutionParameteriv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glGetSeparableFilter) = (PFNGLGETSEPARABLEFILTERPROC)GLH_EXT_GET_PROC_ADDRESS("glGetSeparableFilter"); + if (NULL == GLH_CORE_1_2_NAME(glGetSeparableFilter)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glSeparableFilter2D) = (PFNGLSEPARABLEFILTER2DPROC)GLH_EXT_GET_PROC_ADDRESS("glSeparableFilter2D"); + if (NULL == GLH_CORE_1_2_NAME(glSeparableFilter2D)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glGetHistogram) = (PFNGLGETHISTOGRAMPROC)GLH_EXT_GET_PROC_ADDRESS("glGetHistogram"); + if (NULL == GLH_CORE_1_2_NAME(glGetHistogram)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glGetHistogramParameterfv) = (PFNGLGETHISTOGRAMPARAMETERFVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetHistogramParameterfv"); + if (NULL == GLH_CORE_1_2_NAME(glGetHistogramParameterfv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glGetHistogramParameteriv) = (PFNGLGETHISTOGRAMPARAMETERIVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetHistogramParameteriv"); + if (NULL == GLH_CORE_1_2_NAME(glGetHistogramParameteriv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glGetMinmax) = (PFNGLGETMINMAXPROC)GLH_EXT_GET_PROC_ADDRESS("glGetMinmax"); + if (NULL == GLH_CORE_1_2_NAME(glGetMinmax)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glGetMinmaxParameterfv) = (PFNGLGETMINMAXPARAMETERFVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetMinmaxParameterfv"); + if (NULL == GLH_CORE_1_2_NAME(glGetMinmaxParameterfv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glGetMinmaxParameteriv) = (PFNGLGETMINMAXPARAMETERIVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetMinmaxParameteriv"); + if (NULL == GLH_CORE_1_2_NAME(glGetMinmaxParameteriv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glHistogram) = (PFNGLHISTOGRAMPROC)GLH_EXT_GET_PROC_ADDRESS("glHistogram"); + if (NULL == GLH_CORE_1_2_NAME(glHistogram)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMinmax) = (PFNGLMINMAXPROC)GLH_EXT_GET_PROC_ADDRESS("glMinmax"); + if (NULL == GLH_CORE_1_2_NAME(glMinmax)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glResetHistogram) = (PFNGLRESETHISTOGRAMPROC)GLH_EXT_GET_PROC_ADDRESS("glResetHistogram"); + if (NULL == GLH_CORE_1_2_NAME(glResetHistogram)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glResetMinmax) = (PFNGLRESETMINMAXPROC)GLH_EXT_GET_PROC_ADDRESS("glResetMinmax"); + if (NULL == GLH_CORE_1_2_NAME(glResetMinmax)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glTexImage3D) = (PFNGLTEXIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glTexImage3D"); + if (NULL == GLH_CORE_1_2_NAME(glTexImage3D)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glTexSubImage3D) = (PFNGLTEXSUBIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glTexSubImage3D"); + if (NULL == GLH_CORE_1_2_NAME(glTexSubImage3D)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glCopyTexSubImage3D) = (PFNGLCOPYTEXSUBIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glCopyTexSubImage3D"); + if (NULL == GLH_CORE_1_2_NAME(glCopyTexSubImage3D)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord1d) = (PFNGLMULTITEXCOORD1DPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1d"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord1d)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord1dv) = (PFNGLMULTITEXCOORD1DVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1dv"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord1dv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord1f) = (PFNGLMULTITEXCOORD1FPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1f"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord1f)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord1fv) = (PFNGLMULTITEXCOORD1FVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1fv"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord1fv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord1i) = (PFNGLMULTITEXCOORD1IPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1i"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord1i)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord1iv) = (PFNGLMULTITEXCOORD1IVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1iv"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord1iv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord1s) = (PFNGLMULTITEXCOORD1SPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1s"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord1s)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord1sv) = (PFNGLMULTITEXCOORD1SVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1sv"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord1sv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord2d) = (PFNGLMULTITEXCOORD2DPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2d"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord2d)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord2dv) = (PFNGLMULTITEXCOORD2DVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2dv"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord2dv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord2f) = (PFNGLMULTITEXCOORD2FPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2f"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord2f)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord2fv) = (PFNGLMULTITEXCOORD2FVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2fv"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord2fv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord2i) = (PFNGLMULTITEXCOORD2IPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2i"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord2i)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord2iv) = (PFNGLMULTITEXCOORD2IVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2iv"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord2iv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord2s) = (PFNGLMULTITEXCOORD2SPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2s"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord2s)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord2sv) = (PFNGLMULTITEXCOORD2SVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2sv"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord2sv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord3d) = (PFNGLMULTITEXCOORD3DPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3d"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord3d)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord3dv) = (PFNGLMULTITEXCOORD3DVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3dv"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord3dv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord3f) = (PFNGLMULTITEXCOORD3FPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3f"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord3f)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord3fv) = (PFNGLMULTITEXCOORD3FVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3fv"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord3fv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord3i) = (PFNGLMULTITEXCOORD3IPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3i"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord3i)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord3iv) = (PFNGLMULTITEXCOORD3IVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3iv"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord3iv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord3s) = (PFNGLMULTITEXCOORD3SPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3s"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord3s)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord3sv) = (PFNGLMULTITEXCOORD3SVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3sv"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord3sv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord4d) = (PFNGLMULTITEXCOORD4DPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4d"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord4d)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord4dv) = (PFNGLMULTITEXCOORD4DVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4dv"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord4dv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord4f) = (PFNGLMULTITEXCOORD4FPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4f"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord4f)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord4fv) = (PFNGLMULTITEXCOORD4FVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4fv"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord4fv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord4i) = (PFNGLMULTITEXCOORD4IPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4i"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord4i)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord4iv) = (PFNGLMULTITEXCOORD4IVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4iv"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord4iv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord4s) = (PFNGLMULTITEXCOORD4SPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4s"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord4s)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glMultiTexCoord4sv) = (PFNGLMULTITEXCOORD4SVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4sv"); + if (NULL == GLH_CORE_1_2_NAME(glMultiTexCoord4sv)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glActiveTexture) = (PFNGLACTIVETEXTUREPROC)GLH_EXT_GET_PROC_ADDRESS("glActiveTexture"); + if (NULL == GLH_CORE_1_2_NAME(glActiveTexture)) + return GL_FALSE; + GLH_CORE_1_2_NAME(glClientActiveTexture) = (PFNGLCLIENTACTIVETEXTUREPROC)GLH_EXT_GET_PROC_ADDRESS("glClientActiveTexture"); + if (NULL == GLH_CORE_1_2_NAME(glClientActiveTexture)) + return GL_FALSE; +#endif +#endif + +#ifdef GL_VERSION_1_3 + } else if (0 == strcmp(extension, "GL_VERSION_1_3")) { + GLH_EXT_NAME(glCompressedTexImage3D) = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexImage3D"); + if (NULL == GLH_EXT_NAME(glCompressedTexImage3D)) + return GL_FALSE; + GLH_EXT_NAME(glCompressedTexImage2D) = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexImage2D"); + if (NULL == GLH_EXT_NAME(glCompressedTexImage2D)) + return GL_FALSE; + GLH_EXT_NAME(glCompressedTexImage1D) = (PFNGLCOMPRESSEDTEXIMAGE1DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexImage1D"); + if (NULL == GLH_EXT_NAME(glCompressedTexImage1D)) + return GL_FALSE; + GLH_EXT_NAME(glCompressedTexSubImage3D) = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexSubImage3D"); + if (NULL == GLH_EXT_NAME(glCompressedTexSubImage3D)) + return GL_FALSE; + GLH_EXT_NAME(glCompressedTexSubImage2D) = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexSubImage2D"); + if (NULL == GLH_EXT_NAME(glCompressedTexSubImage2D)) + return GL_FALSE; + GLH_EXT_NAME(glCompressedTexSubImage1D) = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexSubImage1D"); + if (NULL == GLH_EXT_NAME(glCompressedTexSubImage1D)) + return GL_FALSE; + GLH_EXT_NAME(glGetCompressedTexImage) = (PFNGLGETCOMPRESSEDTEXIMAGEPROC)GLH_EXT_GET_PROC_ADDRESS("glGetCompressedTexImage"); + if (NULL == GLH_EXT_NAME(glGetCompressedTexImage)) + return GL_FALSE; + GLH_EXT_NAME(glSampleCoverage) = (PFNGLSAMPLECOVERAGEPROC)GLH_EXT_GET_PROC_ADDRESS("glSampleCoverage"); + if (NULL == GLH_EXT_NAME(glSampleCoverage)) + return GL_FALSE; + GLH_EXT_NAME(glLoadTransposeMatrixf) = (PFNGLLOADTRANSPOSEMATRIXFPROC)GLH_EXT_GET_PROC_ADDRESS("glLoadTransposeMatrixf"); + if (NULL == GLH_EXT_NAME(glLoadTransposeMatrixf)) + return GL_FALSE; + GLH_EXT_NAME(glLoadTransposeMatrixd) = (PFNGLLOADTRANSPOSEMATRIXDPROC)GLH_EXT_GET_PROC_ADDRESS("glLoadTransposeMatrixd"); + if (NULL == GLH_EXT_NAME(glLoadTransposeMatrixd)) + return GL_FALSE; + GLH_EXT_NAME(glMultTransposeMatrixf) = (PFNGLMULTTRANSPOSEMATRIXFPROC)GLH_EXT_GET_PROC_ADDRESS("glMultTransposeMatrixf"); + if (NULL == GLH_EXT_NAME(glMultTransposeMatrixf)) + return GL_FALSE; + GLH_EXT_NAME(glMultTransposeMatrixd) = (PFNGLMULTTRANSPOSEMATRIXDPROC)GLH_EXT_GET_PROC_ADDRESS("glMultTransposeMatrixd"); + if (NULL == GLH_EXT_NAME(glMultTransposeMatrixd)) + return GL_FALSE; +#endif + +#ifdef GL_VERSION_1_4 + } else if (0 == strcmp(extension, "GL_VERSION_1_4")) { + GLH_EXT_NAME(glMultiDrawArrays) = (PFNGLMULTIDRAWARRAYSPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiDrawArrays"); + if (NULL == GLH_EXT_NAME(glMultiDrawArrays)) + return GL_FALSE; + GLH_EXT_NAME(glMultiDrawElements) = (PFNGLMULTIDRAWELEMENTSPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiDrawElements"); + if (NULL == GLH_EXT_NAME(glMultiDrawElements)) + return GL_FALSE; + GLH_EXT_NAME(glPointParameterf) = (PFNGLPOINTPARAMETERFPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterf"); + if (NULL == GLH_EXT_NAME(glPointParameterf)) + return GL_FALSE; + GLH_EXT_NAME(glPointParameterfv) = (PFNGLPOINTPARAMETERFVPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterfv"); + if (NULL == GLH_EXT_NAME(glPointParameterfv)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3b) = (PFNGLSECONDARYCOLOR3BPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3b"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3b)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3bv) = (PFNGLSECONDARYCOLOR3BVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3bv"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3bv)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3d) = (PFNGLSECONDARYCOLOR3DPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3d"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3d)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3dv) = (PFNGLSECONDARYCOLOR3DVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3dv"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3dv)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3f) = (PFNGLSECONDARYCOLOR3FPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3f"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3f)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3fv) = (PFNGLSECONDARYCOLOR3FVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3fv"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3fv)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3i) = (PFNGLSECONDARYCOLOR3IPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3i"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3i)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3iv) = (PFNGLSECONDARYCOLOR3IVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3iv"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3iv)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3s) = (PFNGLSECONDARYCOLOR3SPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3s"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3s)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3sv) = (PFNGLSECONDARYCOLOR3SVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3sv"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3sv)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3ub) = (PFNGLSECONDARYCOLOR3UBPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3ub"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3ub)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3ubv) = (PFNGLSECONDARYCOLOR3UBVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3ubv"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3ubv)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3ui) = (PFNGLSECONDARYCOLOR3UIPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3ui"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3ui)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3uiv) = (PFNGLSECONDARYCOLOR3UIVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3uiv"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3uiv)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3us) = (PFNGLSECONDARYCOLOR3USPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3us"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3us)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3usv) = (PFNGLSECONDARYCOLOR3USVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3usv"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3usv)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColorPointer) = (PFNGLSECONDARYCOLORPOINTERPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColorPointer"); + if (NULL == GLH_EXT_NAME(glSecondaryColorPointer)) + return GL_FALSE; + GLH_EXT_NAME(glBlendFuncSeparate) = (PFNGLBLENDFUNCSEPARATEPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendFuncSeparate"); + if (NULL == GLH_EXT_NAME(glBlendFuncSeparate)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos2d) = (PFNGLWINDOWPOS2DPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2d"); + if (NULL == GLH_EXT_NAME(glWindowPos2d)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos2f) = (PFNGLWINDOWPOS2FPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2f"); + if (NULL == GLH_EXT_NAME(glWindowPos2f)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos2i) = (PFNGLWINDOWPOS2IPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2i"); + if (NULL == GLH_EXT_NAME(glWindowPos2i)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos2s) = (PFNGLWINDOWPOS2SPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2s"); + if (NULL == GLH_EXT_NAME(glWindowPos2s)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos2dv) = (PFNGLWINDOWPOS2DVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2dv"); + if (NULL == GLH_EXT_NAME(glWindowPos2dv)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos2fv) = (PFNGLWINDOWPOS2FVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2fv"); + if (NULL == GLH_EXT_NAME(glWindowPos2fv)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos2iv) = (PFNGLWINDOWPOS2IVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2iv"); + if (NULL == GLH_EXT_NAME(glWindowPos2iv)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos2sv) = (PFNGLWINDOWPOS2SVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2sv"); + if (NULL == GLH_EXT_NAME(glWindowPos2sv)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos3d) = (PFNGLWINDOWPOS3DPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3d"); + if (NULL == GLH_EXT_NAME(glWindowPos3d)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos3f) = (PFNGLWINDOWPOS3FPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3f"); + if (NULL == GLH_EXT_NAME(glWindowPos3f)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos3i) = (PFNGLWINDOWPOS3IPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3i"); + if (NULL == GLH_EXT_NAME(glWindowPos3i)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos3s) = (PFNGLWINDOWPOS3SPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3s"); + if (NULL == GLH_EXT_NAME(glWindowPos3s)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos3dv) = (PFNGLWINDOWPOS3DVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3dv"); + if (NULL == GLH_EXT_NAME(glWindowPos3dv)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos3fv) = (PFNGLWINDOWPOS3FVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3fv"); + if (NULL == GLH_EXT_NAME(glWindowPos3fv)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos3iv) = (PFNGLWINDOWPOS3IVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3iv"); + if (NULL == GLH_EXT_NAME(glWindowPos3iv)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos3sv) = (PFNGLWINDOWPOS3SVPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3sv"); + if (NULL == GLH_EXT_NAME(glWindowPos3sv)) + return GL_FALSE; +#endif + +#ifdef GL_ARB_depth_texture + } else if (0 == strcmp(extension, "GL_ARB_depth_texture")) { +#endif + +#ifdef GL_ARB_fragment_program + } else if (0 == strcmp(extension, "GL_ARB_fragment_program")) { +#endif + +#ifdef GL_ARB_multisample + } else if (0 == strcmp(extension, "GL_ARB_multisample")) { +#endif + +#ifdef _WIN32 +#ifdef GL_ARB_multitexture + } else if (0 == strcmp(extension, "GL_ARB_multitexture")) { + GLH_EXT_NAME(glMultiTexCoord1dARB) = (PFNGLMULTITEXCOORD1DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1dARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord1dARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord1dvARB) = (PFNGLMULTITEXCOORD1DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1dvARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord1dvARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord1fARB) = (PFNGLMULTITEXCOORD1FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1fARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord1fARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord1fvARB) = (PFNGLMULTITEXCOORD1FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1fvARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord1fvARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord1iARB) = (PFNGLMULTITEXCOORD1IARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1iARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord1iARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord1ivARB) = (PFNGLMULTITEXCOORD1IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1ivARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord1ivARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord1sARB) = (PFNGLMULTITEXCOORD1SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1sARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord1sARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord1svARB) = (PFNGLMULTITEXCOORD1SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1svARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord1svARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord2dARB) = (PFNGLMULTITEXCOORD2DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2dARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord2dARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord2dvARB) = (PFNGLMULTITEXCOORD2DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2dvARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord2dvARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord2fARB) = (PFNGLMULTITEXCOORD2FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2fARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord2fARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord2fvARB) = (PFNGLMULTITEXCOORD2FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2fvARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord2fvARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord2iARB) = (PFNGLMULTITEXCOORD2IARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2iARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord2iARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord2ivARB) = (PFNGLMULTITEXCOORD2IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2ivARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord2ivARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord2sARB) = (PFNGLMULTITEXCOORD2SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2sARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord2sARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord2svARB) = (PFNGLMULTITEXCOORD2SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2svARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord2svARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord3dARB) = (PFNGLMULTITEXCOORD3DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3dARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord3dARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord3dvARB) = (PFNGLMULTITEXCOORD3DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3dvARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord3dvARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord3fARB) = (PFNGLMULTITEXCOORD3FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3fARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord3fARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord3fvARB) = (PFNGLMULTITEXCOORD3FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3fvARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord3fvARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord3iARB) = (PFNGLMULTITEXCOORD3IARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3iARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord3iARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord3ivARB) = (PFNGLMULTITEXCOORD3IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3ivARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord3ivARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord3sARB) = (PFNGLMULTITEXCOORD3SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3sARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord3sARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord3svARB) = (PFNGLMULTITEXCOORD3SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3svARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord3svARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord4dARB) = (PFNGLMULTITEXCOORD4DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4dARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord4dARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord4dvARB) = (PFNGLMULTITEXCOORD4DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4dvARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord4dvARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord4fARB) = (PFNGLMULTITEXCOORD4FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4fARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord4fARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord4fvARB) = (PFNGLMULTITEXCOORD4FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4fvARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord4fvARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord4iARB) = (PFNGLMULTITEXCOORD4IARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4iARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord4iARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord4ivARB) = (PFNGLMULTITEXCOORD4IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4ivARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord4ivARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord4sARB) = (PFNGLMULTITEXCOORD4SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4sARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord4sARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord4svARB) = (PFNGLMULTITEXCOORD4SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4svARB"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord4svARB)) + return GL_FALSE; + GLH_EXT_NAME(glActiveTextureARB) = (PFNGLACTIVETEXTUREARBPROC)GLH_EXT_GET_PROC_ADDRESS("glActiveTextureARB"); + if (NULL == GLH_EXT_NAME(glActiveTextureARB)) + return GL_FALSE; + GLH_EXT_NAME(glClientActiveTextureARB) = (PFNGLCLIENTACTIVETEXTUREARBPROC)GLH_EXT_GET_PROC_ADDRESS("glClientActiveTextureARB"); + if (NULL == GLH_EXT_NAME(glClientActiveTextureARB)) + return GL_FALSE; +#endif +#endif + +#ifdef GL_ARB_point_parameters + } else if (0 == strcmp(extension, "GL_ARB_point_parameters")) { + GLH_EXT_NAME(glPointParameterfARB) = (PFNGLPOINTPARAMETERFARBPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterfARB"); + if (NULL == GLH_EXT_NAME(glPointParameterfARB)) + return GL_FALSE; + GLH_EXT_NAME(glPointParameterfvARB) = (PFNGLPOINTPARAMETERFVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterfvARB"); + if (NULL == GLH_EXT_NAME(glPointParameterfvARB)) + return GL_FALSE; +#endif + +#ifdef GL_ARB_shadow + } else if (0 == strcmp(extension, "GL_ARB_shadow")) { +#endif + +#ifdef GL_ARB_texture_border_clamp + } else if (0 == strcmp(extension, "GL_ARB_texture_border_clamp")) { +#endif + +#ifdef GL_ARB_texture_compression + } else if (0 == strcmp(extension, "GL_ARB_texture_compression")) { + GLH_EXT_NAME(glCompressedTexImage3DARB) = (PFNGLCOMPRESSEDTEXIMAGE3DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexImage3DARB"); + if (NULL == GLH_EXT_NAME(glCompressedTexImage3DARB)) + return GL_FALSE; + GLH_EXT_NAME(glCompressedTexImage2DARB) = (PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexImage2DARB"); + if (NULL == GLH_EXT_NAME(glCompressedTexImage2DARB)) + return GL_FALSE; + GLH_EXT_NAME(glCompressedTexImage1DARB) = (PFNGLCOMPRESSEDTEXIMAGE1DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexImage1DARB"); + if (NULL == GLH_EXT_NAME(glCompressedTexImage1DARB)) + return GL_FALSE; + GLH_EXT_NAME(glCompressedTexSubImage3DARB) = (PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexSubImage3DARB"); + if (NULL == GLH_EXT_NAME(glCompressedTexSubImage3DARB)) + return GL_FALSE; + GLH_EXT_NAME(glCompressedTexSubImage2DARB) = (PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexSubImage2DARB"); + if (NULL == GLH_EXT_NAME(glCompressedTexSubImage2DARB)) + return GL_FALSE; + GLH_EXT_NAME(glCompressedTexSubImage1DARB) = (PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glCompressedTexSubImage1DARB"); + if (NULL == GLH_EXT_NAME(glCompressedTexSubImage1DARB)) + return GL_FALSE; + GLH_EXT_NAME(glGetCompressedTexImageARB) = (PFNGLGETCOMPRESSEDTEXIMAGEARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetCompressedTexImageARB"); + if (NULL == GLH_EXT_NAME(glGetCompressedTexImageARB)) + return GL_FALSE; +#endif + +#ifdef GL_ARB_texture_cube_map + } else if (0 == strcmp(extension, "GL_ARB_texture_cube_map")) { +#endif + +#ifdef GL_ARB_texture_env_add + } else if (0 == strcmp(extension, "GL_ARB_texture_env_add")) { +#endif + +#ifdef GL_ARB_texture_env_combine + } else if (0 == strcmp(extension, "GL_ARB_texture_env_combine")) { +#endif + +#ifdef GL_ARB_texture_env_dot3 + } else if (0 == strcmp(extension, "GL_ARB_texture_env_dot3")) { +#endif + +#ifdef GL_ARB_texture_mirrored_repeat + } else if (0 == strcmp(extension, "GL_ARB_texture_mirrored_repeat")) { +#endif + +#ifdef GL_ARB_transpose_matrix + } else if (0 == strcmp(extension, "GL_ARB_transpose_matrix")) { + GLH_EXT_NAME(glLoadTransposeMatrixfARB) = (PFNGLLOADTRANSPOSEMATRIXFARBPROC)GLH_EXT_GET_PROC_ADDRESS("glLoadTransposeMatrixfARB"); + if (NULL == GLH_EXT_NAME(glLoadTransposeMatrixfARB)) + return GL_FALSE; + GLH_EXT_NAME(glLoadTransposeMatrixdARB) = (PFNGLLOADTRANSPOSEMATRIXDARBPROC)GLH_EXT_GET_PROC_ADDRESS("glLoadTransposeMatrixdARB"); + if (NULL == GLH_EXT_NAME(glLoadTransposeMatrixdARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultTransposeMatrixfARB) = (PFNGLMULTTRANSPOSEMATRIXFARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultTransposeMatrixfARB"); + if (NULL == GLH_EXT_NAME(glMultTransposeMatrixfARB)) + return GL_FALSE; + GLH_EXT_NAME(glMultTransposeMatrixdARB) = (PFNGLMULTTRANSPOSEMATRIXDARBPROC)GLH_EXT_GET_PROC_ADDRESS("glMultTransposeMatrixdARB"); + if (NULL == GLH_EXT_NAME(glMultTransposeMatrixdARB)) + return GL_FALSE; +#endif + +#ifdef GL_ARB_vertex_program + } else if (0 == strcmp(extension, "GL_ARB_vertex_program")) { + GLH_EXT_NAME(glVertexAttrib1sARB) = (PFNGLVERTEXATTRIB1SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1sARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib1sARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib1fARB) = (PFNGLVERTEXATTRIB1FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1fARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib1fARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib1dARB) = (PFNGLVERTEXATTRIB1DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1dARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib1dARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib2sARB) = (PFNGLVERTEXATTRIB2SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2sARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib2sARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib2fARB) = (PFNGLVERTEXATTRIB2FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2fARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib2fARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib2dARB) = (PFNGLVERTEXATTRIB2DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2dARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib2dARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib3sARB) = (PFNGLVERTEXATTRIB3SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3sARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib3sARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib3fARB) = (PFNGLVERTEXATTRIB3FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3fARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib3fARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib3dARB) = (PFNGLVERTEXATTRIB3DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3dARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib3dARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4sARB) = (PFNGLVERTEXATTRIB4SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4sARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4sARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4fARB) = (PFNGLVERTEXATTRIB4FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4fARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4fARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4dARB) = (PFNGLVERTEXATTRIB4DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4dARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4dARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4NubARB) = (PFNGLVERTEXATTRIB4NUBARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4NubARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4NubARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib1svARB) = (PFNGLVERTEXATTRIB1SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1svARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib1svARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib1fvARB) = (PFNGLVERTEXATTRIB1FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1fvARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib1fvARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib1dvARB) = (PFNGLVERTEXATTRIB1DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1dvARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib1dvARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib2svARB) = (PFNGLVERTEXATTRIB2SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2svARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib2svARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib2fvARB) = (PFNGLVERTEXATTRIB2FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2fvARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib2fvARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib2dvARB) = (PFNGLVERTEXATTRIB2DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2dvARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib2dvARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib3svARB) = (PFNGLVERTEXATTRIB3SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3svARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib3svARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib3fvARB) = (PFNGLVERTEXATTRIB3FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3fvARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib3fvARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib3dvARB) = (PFNGLVERTEXATTRIB3DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3dvARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib3dvARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4bvARB) = (PFNGLVERTEXATTRIB4BVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4bvARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4bvARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4svARB) = (PFNGLVERTEXATTRIB4SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4svARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4svARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4ivARB) = (PFNGLVERTEXATTRIB4IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4ivARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4ivARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4ubvARB) = (PFNGLVERTEXATTRIB4UBVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4ubvARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4ubvARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4usvARB) = (PFNGLVERTEXATTRIB4USVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4usvARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4usvARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4uivARB) = (PFNGLVERTEXATTRIB4UIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4uivARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4uivARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4fvARB) = (PFNGLVERTEXATTRIB4FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4fvARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4fvARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4dvARB) = (PFNGLVERTEXATTRIB4DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4dvARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4dvARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4NbvARB) = (PFNGLVERTEXATTRIB4NBVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4NbvARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4NbvARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4NsvARB) = (PFNGLVERTEXATTRIB4NSVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4NsvARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4NsvARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4NivARB) = (PFNGLVERTEXATTRIB4NIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4NivARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4NivARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4NubvARB) = (PFNGLVERTEXATTRIB4NUBVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4NubvARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4NubvARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4NusvARB) = (PFNGLVERTEXATTRIB4NUSVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4NusvARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4NusvARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4NuivARB) = (PFNGLVERTEXATTRIB4NUIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4NuivARB"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4NuivARB)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttribPointerARB) = (PFNGLVERTEXATTRIBPOINTERARBPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribPointerARB"); + if (NULL == GLH_EXT_NAME(glVertexAttribPointerARB)) + return GL_FALSE; + GLH_EXT_NAME(glEnableVertexAttribArrayARB) = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)GLH_EXT_GET_PROC_ADDRESS("glEnableVertexAttribArrayARB"); + if (NULL == GLH_EXT_NAME(glEnableVertexAttribArrayARB)) + return GL_FALSE; + GLH_EXT_NAME(glDisableVertexAttribArrayARB) = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)GLH_EXT_GET_PROC_ADDRESS("glDisableVertexAttribArrayARB"); + if (NULL == GLH_EXT_NAME(glDisableVertexAttribArrayARB)) + return GL_FALSE; + GLH_EXT_NAME(glProgramStringARB) = (PFNGLPROGRAMSTRINGARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramStringARB"); + if (NULL == GLH_EXT_NAME(glProgramStringARB)) + return GL_FALSE; + GLH_EXT_NAME(glBindProgramARB) = (PFNGLBINDPROGRAMARBPROC)GLH_EXT_GET_PROC_ADDRESS("glBindProgramARB"); + if (NULL == GLH_EXT_NAME(glBindProgramARB)) + return GL_FALSE; + GLH_EXT_NAME(glDeleteProgramsARB) = (PFNGLDELETEPROGRAMSARBPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteProgramsARB"); + if (NULL == GLH_EXT_NAME(glDeleteProgramsARB)) + return GL_FALSE; + GLH_EXT_NAME(glGenProgramsARB) = (PFNGLGENPROGRAMSARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGenProgramsARB"); + if (NULL == GLH_EXT_NAME(glGenProgramsARB)) + return GL_FALSE; + GLH_EXT_NAME(glProgramEnvParameter4dARB) = (PFNGLPROGRAMENVPARAMETER4DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramEnvParameter4dARB"); + if (NULL == GLH_EXT_NAME(glProgramEnvParameter4dARB)) + return GL_FALSE; + GLH_EXT_NAME(glProgramEnvParameter4dvARB) = (PFNGLPROGRAMENVPARAMETER4DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramEnvParameter4dvARB"); + if (NULL == GLH_EXT_NAME(glProgramEnvParameter4dvARB)) + return GL_FALSE; + GLH_EXT_NAME(glProgramEnvParameter4fARB) = (PFNGLPROGRAMENVPARAMETER4FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramEnvParameter4fARB"); + if (NULL == GLH_EXT_NAME(glProgramEnvParameter4fARB)) + return GL_FALSE; + GLH_EXT_NAME(glProgramEnvParameter4fvARB) = (PFNGLPROGRAMENVPARAMETER4FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramEnvParameter4fvARB"); + if (NULL == GLH_EXT_NAME(glProgramEnvParameter4fvARB)) + return GL_FALSE; + GLH_EXT_NAME(glProgramLocalParameter4dARB) = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramLocalParameter4dARB"); + if (NULL == GLH_EXT_NAME(glProgramLocalParameter4dARB)) + return GL_FALSE; + GLH_EXT_NAME(glProgramLocalParameter4dvARB) = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramLocalParameter4dvARB"); + if (NULL == GLH_EXT_NAME(glProgramLocalParameter4dvARB)) + return GL_FALSE; + GLH_EXT_NAME(glProgramLocalParameter4fARB) = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramLocalParameter4fARB"); + if (NULL == GLH_EXT_NAME(glProgramLocalParameter4fARB)) + return GL_FALSE; + GLH_EXT_NAME(glProgramLocalParameter4fvARB) = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramLocalParameter4fvARB"); + if (NULL == GLH_EXT_NAME(glProgramLocalParameter4fvARB)) + return GL_FALSE; + GLH_EXT_NAME(glGetProgramEnvParameterdvARB) = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramEnvParameterdvARB"); + if (NULL == GLH_EXT_NAME(glGetProgramEnvParameterdvARB)) + return GL_FALSE; + GLH_EXT_NAME(glGetProgramEnvParameterfvARB) = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramEnvParameterfvARB"); + if (NULL == GLH_EXT_NAME(glGetProgramEnvParameterfvARB)) + return GL_FALSE; + GLH_EXT_NAME(glGetProgramLocalParameterdvARB) = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramLocalParameterdvARB"); + if (NULL == GLH_EXT_NAME(glGetProgramLocalParameterdvARB)) + return GL_FALSE; + GLH_EXT_NAME(glGetProgramLocalParameterfvARB) = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramLocalParameterfvARB"); + if (NULL == GLH_EXT_NAME(glGetProgramLocalParameterfvARB)) + return GL_FALSE; + GLH_EXT_NAME(glGetProgramivARB) = (PFNGLGETPROGRAMIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramivARB"); + if (NULL == GLH_EXT_NAME(glGetProgramivARB)) + return GL_FALSE; + GLH_EXT_NAME(glGetProgramStringARB) = (PFNGLGETPROGRAMSTRINGARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramStringARB"); + if (NULL == GLH_EXT_NAME(glGetProgramStringARB)) + return GL_FALSE; + GLH_EXT_NAME(glGetVertexAttribdvARB) = (PFNGLGETVERTEXATTRIBDVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribdvARB"); + if (NULL == GLH_EXT_NAME(glGetVertexAttribdvARB)) + return GL_FALSE; + GLH_EXT_NAME(glGetVertexAttribfvARB) = (PFNGLGETVERTEXATTRIBFVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribfvARB"); + if (NULL == GLH_EXT_NAME(glGetVertexAttribfvARB)) + return GL_FALSE; + GLH_EXT_NAME(glGetVertexAttribivARB) = (PFNGLGETVERTEXATTRIBIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribivARB"); + if (NULL == GLH_EXT_NAME(glGetVertexAttribivARB)) + return GL_FALSE; + GLH_EXT_NAME(glGetVertexAttribPointervARB) = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribPointervARB"); + if (NULL == GLH_EXT_NAME(glGetVertexAttribPointervARB)) + return GL_FALSE; + GLH_EXT_NAME(glIsProgramARB) = (PFNGLISPROGRAMARBPROC)GLH_EXT_GET_PROC_ADDRESS("glIsProgramARB"); + if (NULL == GLH_EXT_NAME(glIsProgramARB)) + return GL_FALSE; +#endif + +#ifdef GL_ARB_window_pos + } else if (0 == strcmp(extension, "GL_ARB_window_pos")) { + GLH_EXT_NAME(glWindowPos2dARB) = (PFNGLWINDOWPOS2DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2dARB"); + if (NULL == GLH_EXT_NAME(glWindowPos2dARB)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos2fARB) = (PFNGLWINDOWPOS2FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2fARB"); + if (NULL == GLH_EXT_NAME(glWindowPos2fARB)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos2iARB) = (PFNGLWINDOWPOS2IARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2iARB"); + if (NULL == GLH_EXT_NAME(glWindowPos2iARB)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos2sARB) = (PFNGLWINDOWPOS2SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2sARB"); + if (NULL == GLH_EXT_NAME(glWindowPos2sARB)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos2dvARB) = (PFNGLWINDOWPOS2DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2dvARB"); + if (NULL == GLH_EXT_NAME(glWindowPos2dvARB)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos2fvARB) = (PFNGLWINDOWPOS2FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2fvARB"); + if (NULL == GLH_EXT_NAME(glWindowPos2fvARB)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos2ivARB) = (PFNGLWINDOWPOS2IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2ivARB"); + if (NULL == GLH_EXT_NAME(glWindowPos2ivARB)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos2svARB) = (PFNGLWINDOWPOS2SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos2svARB"); + if (NULL == GLH_EXT_NAME(glWindowPos2svARB)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos3dARB) = (PFNGLWINDOWPOS3DARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3dARB"); + if (NULL == GLH_EXT_NAME(glWindowPos3dARB)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos3fARB) = (PFNGLWINDOWPOS3FARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3fARB"); + if (NULL == GLH_EXT_NAME(glWindowPos3fARB)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos3iARB) = (PFNGLWINDOWPOS3IARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3iARB"); + if (NULL == GLH_EXT_NAME(glWindowPos3iARB)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos3sARB) = (PFNGLWINDOWPOS3SARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3sARB"); + if (NULL == GLH_EXT_NAME(glWindowPos3sARB)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos3dvARB) = (PFNGLWINDOWPOS3DVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3dvARB"); + if (NULL == GLH_EXT_NAME(glWindowPos3dvARB)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos3fvARB) = (PFNGLWINDOWPOS3FVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3fvARB"); + if (NULL == GLH_EXT_NAME(glWindowPos3fvARB)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos3ivARB) = (PFNGLWINDOWPOS3IVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3ivARB"); + if (NULL == GLH_EXT_NAME(glWindowPos3ivARB)) + return GL_FALSE; + GLH_EXT_NAME(glWindowPos3svARB) = (PFNGLWINDOWPOS3SVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glWindowPos3svARB"); + if (NULL == GLH_EXT_NAME(glWindowPos3svARB)) + return GL_FALSE; +#endif + +#ifdef GL_EXT_abgr + } else if (0 == strcmp(extension, "GL_EXT_abgr")) { +#endif + +#ifdef GL_EXT_bgra + } else if (0 == strcmp(extension, "GL_EXT_bgra")) { +#endif + +#ifdef GL_EXT_blend_color + } else if (0 == strcmp(extension, "GL_EXT_blend_color")) { + GLH_EXT_NAME(glBlendColorEXT) = (PFNGLBLENDCOLOREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendColorEXT"); + if (NULL == GLH_EXT_NAME(glBlendColorEXT)) + return GL_FALSE; +#endif + +#ifdef GL_EXT_blend_func_separate + } else if (0 == strcmp(extension, "GL_EXT_blend_func_separate")) { + GLH_EXT_NAME(glBlendFuncSeparateEXT) = (PFNGLBLENDFUNCSEPARATEEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendFuncSeparateEXT"); + if (NULL == GLH_EXT_NAME(glBlendFuncSeparateEXT)) + return GL_FALSE; +#endif + +#ifdef GL_EXT_blend_minmax + } else if (0 == strcmp(extension, "GL_EXT_blend_minmax")) { + GLH_EXT_NAME(glBlendEquationEXT) = (PFNGLBLENDEQUATIONEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glBlendEquationEXT"); + if (NULL == GLH_EXT_NAME(glBlendEquationEXT)) + return GL_FALSE; +#endif + +#ifdef GL_EXT_blend_subtract + } else if (0 == strcmp(extension, "GL_EXT_blend_subtract")) { +#endif + +#ifdef GL_EXT_compiled_vertex_array + } else if (0 == strcmp(extension, "GL_EXT_compiled_vertex_array")) { + GLH_EXT_NAME(glLockArraysEXT) = (PFNGLLOCKARRAYSEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glLockArraysEXT"); + if (NULL == GLH_EXT_NAME(glLockArraysEXT)) + return GL_FALSE; + GLH_EXT_NAME(glUnlockArraysEXT) = (PFNGLUNLOCKARRAYSEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glUnlockArraysEXT"); + if (NULL == GLH_EXT_NAME(glUnlockArraysEXT)) + return GL_FALSE; +#endif + +#ifdef GL_EXT_draw_range_elements + } else if (0 == strcmp(extension, "GL_EXT_draw_range_elements")) { +#endif + +#ifdef GL_EXT_fog_coord + } else if (0 == strcmp(extension, "GL_EXT_fog_coord")) { + GLH_EXT_NAME(glFogCoorddEXT) = (PFNGLFOGCOORDDEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glFogCoorddEXT"); + if (NULL == GLH_EXT_NAME(glFogCoorddEXT)) + return GL_FALSE; + GLH_EXT_NAME(glFogCoorddvEXT) = (PFNGLFOGCOORDDVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glFogCoorddvEXT"); + if (NULL == GLH_EXT_NAME(glFogCoorddvEXT)) + return GL_FALSE; + GLH_EXT_NAME(glFogCoordfEXT) = (PFNGLFOGCOORDFEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glFogCoordfEXT"); + if (NULL == GLH_EXT_NAME(glFogCoordfEXT)) + return GL_FALSE; + GLH_EXT_NAME(glFogCoordfvEXT) = (PFNGLFOGCOORDFVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glFogCoordfvEXT"); + if (NULL == GLH_EXT_NAME(glFogCoordfvEXT)) + return GL_FALSE; + GLH_EXT_NAME(glFogCoordPointerEXT) = (PFNGLFOGCOORDPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glFogCoordPointerEXT"); + if (NULL == GLH_EXT_NAME(glFogCoordPointerEXT)) + return GL_FALSE; +#endif + +#ifdef GL_EXT_multi_draw_arrays + } else if (0 == strcmp(extension, "GL_EXT_multi_draw_arrays")) { + GLH_EXT_NAME(glMultiDrawArraysEXT) = (PFNGLMULTIDRAWARRAYSEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiDrawArraysEXT"); + if (NULL == GLH_EXT_NAME(glMultiDrawArraysEXT)) + return GL_FALSE; + GLH_EXT_NAME(glMultiDrawElementsEXT) = (PFNGLMULTIDRAWELEMENTSEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiDrawElementsEXT"); + if (NULL == GLH_EXT_NAME(glMultiDrawElementsEXT)) + return GL_FALSE; +#endif + +#ifdef GL_EXT_light_max_exponent + } else if (0 == strcmp(extension, "GL_EXT_light_max_exponent")) { +#endif + +#ifdef GL_EXT_packed_pixels + } else if (0 == strcmp(extension, "GL_EXT_packed_pixels")) { +#endif + +#ifdef GL_EXT_paletted_texture + } else if (0 == strcmp(extension, "GL_EXT_paletted_texture")) { + GLH_EXT_NAME(glColorSubTableEXT) = (PFNGLCOLORSUBTABLEEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glColorSubTableEXT"); + if (NULL == GLH_EXT_NAME(glColorSubTableEXT)) + return GL_FALSE; + GLH_EXT_NAME(glColorTableEXT) = (PFNGLCOLORTABLEEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glColorTableEXT"); + if (NULL == GLH_EXT_NAME(glColorTableEXT)) + return GL_FALSE; + GLH_EXT_NAME(glGetColorTableEXT) = (PFNGLGETCOLORTABLEEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glGetColorTableEXT"); + if (NULL == GLH_EXT_NAME(glGetColorTableEXT)) + return GL_FALSE; + GLH_EXT_NAME(glGetColorTableParameterfvEXT) = (PFNGLGETCOLORTABLEPARAMETERFVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glGetColorTableParameterfvEXT"); + if (NULL == GLH_EXT_NAME(glGetColorTableParameterfvEXT)) + return GL_FALSE; + GLH_EXT_NAME(glGetColorTableParameterivEXT) = (PFNGLGETCOLORTABLEPARAMETERIVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glGetColorTableParameterivEXT"); + if (NULL == GLH_EXT_NAME(glGetColorTableParameterivEXT)) + return GL_FALSE; +#endif + +#ifdef GL_EXT_point_parameters + } else if (0 == strcmp(extension, "GL_EXT_point_parameters")) { + GLH_EXT_NAME(glPointParameterfEXT) = (PFNGLPOINTPARAMETERFEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterfEXT"); + if (NULL == GLH_EXT_NAME(glPointParameterfEXT)) + return GL_FALSE; + GLH_EXT_NAME(glPointParameterfvEXT) = (PFNGLPOINTPARAMETERFVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterfvEXT"); + if (NULL == GLH_EXT_NAME(glPointParameterfvEXT)) + return GL_FALSE; +#endif + +#ifdef GL_EXT_rescale_normal + } else if (0 == strcmp(extension, "GL_EXT_rescale_normal")) { +#endif + +#ifdef GL_EXT_secondary_color + } else if (0 == strcmp(extension, "GL_EXT_secondary_color")) { + GLH_EXT_NAME(glSecondaryColor3bEXT) = (PFNGLSECONDARYCOLOR3BEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3bEXT"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3bEXT)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3bvEXT) = (PFNGLSECONDARYCOLOR3BVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3bvEXT"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3bvEXT)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3dEXT) = (PFNGLSECONDARYCOLOR3DEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3dEXT"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3dEXT)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3dvEXT) = (PFNGLSECONDARYCOLOR3DVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3dvEXT"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3dvEXT)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3fEXT) = (PFNGLSECONDARYCOLOR3FEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3fEXT"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3fEXT)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3fvEXT) = (PFNGLSECONDARYCOLOR3FVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3fvEXT"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3fvEXT)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3iEXT) = (PFNGLSECONDARYCOLOR3IEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3iEXT"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3iEXT)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3ivEXT) = (PFNGLSECONDARYCOLOR3IVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3ivEXT"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3ivEXT)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3sEXT) = (PFNGLSECONDARYCOLOR3SEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3sEXT"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3sEXT)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3svEXT) = (PFNGLSECONDARYCOLOR3SVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3svEXT"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3svEXT)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3ubEXT) = (PFNGLSECONDARYCOLOR3UBEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3ubEXT"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3ubEXT)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3ubvEXT) = (PFNGLSECONDARYCOLOR3UBVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3ubvEXT"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3ubvEXT)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3uiEXT) = (PFNGLSECONDARYCOLOR3UIEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3uiEXT"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3uiEXT)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3uivEXT) = (PFNGLSECONDARYCOLOR3UIVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3uivEXT"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3uivEXT)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3usEXT) = (PFNGLSECONDARYCOLOR3USEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3usEXT"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3usEXT)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3usvEXT) = (PFNGLSECONDARYCOLOR3USVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3usvEXT"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3usvEXT)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColorPointerEXT) = (PFNGLSECONDARYCOLORPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColorPointerEXT"); + if (NULL == GLH_EXT_NAME(glSecondaryColorPointerEXT)) + return GL_FALSE; +#endif + +#ifdef GL_EXT_separate_specular_color + } else if (0 == strcmp(extension, "GL_EXT_separate_specular_color")) { +#endif + +#ifdef GL_EXT_shadow_funcs + } else if (0 == strcmp(extension, "GL_EXT_shadow_funcs")) { +#endif + +#ifdef GL_EXT_shared_texture_palette + } else if (0 == strcmp(extension, "GL_EXT_shared_texture_palette")) { +#endif + +#ifdef GL_EXT_stencil_two_side + } else if (0 == strcmp(extension, "GL_EXT_stencil_two_side")) { + GLH_EXT_NAME(glActiveStencilFaceEXT) = (PFNGLACTIVESTENCILFACEEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glActiveStencilFaceEXT"); + if (NULL == GLH_EXT_NAME(glActiveStencilFaceEXT)) + return GL_FALSE; +#endif + +#ifdef GL_EXT_stencil_wrap + } else if (0 == strcmp(extension, "GL_EXT_stencil_wrap")) { +#endif + +#ifdef GL_EXT_texture_compression_s3tc + } else if (0 == strcmp(extension, "GL_EXT_texture_compression_s3tc")) { +#endif + +#ifdef GL_EXT_texture_cube_map + } else if (0 == strcmp(extension, "GL_EXT_texture_cube_map")) { +#endif + +#ifdef GL_EXT_texture_edge_clamp + } else if (0 == strcmp(extension, "GL_EXT_texture_edge_clamp")) { +#endif + +#ifdef GL_EXT_texture_env_add + } else if (0 == strcmp(extension, "GL_EXT_texture_env_add")) { +#endif + +#ifdef GL_EXT_texture_env_combine + } else if (0 == strcmp(extension, "GL_EXT_texture_env_combine")) { +#endif + +#ifdef GL_EXT_texture_env_dot3 + } else if (0 == strcmp(extension, "GL_EXT_texture_env_dot3")) { +#endif + +#ifdef GL_EXT_texture_filter_anisotropic + } else if (0 == strcmp(extension, "GL_EXT_texture_filter_anisotropic")) { +#endif + +#ifdef GL_EXT_texture_lod_bias + } else if (0 == strcmp(extension, "GL_EXT_texture_lod_bias")) { +#endif + +#ifdef GL_EXT_texture_object + } else if (0 == strcmp(extension, "GL_EXT_texture_object")) { + GLH_EXT_NAME(glAreTexturesResidentEXT) = (PFNGLARETEXTURESRESIDENTEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glAreTexturesResidentEXT"); + if (NULL == GLH_EXT_NAME(glAreTexturesResidentEXT)) + return GL_FALSE; + GLH_EXT_NAME(glBindTextureEXT) = (PFNGLBINDTEXTUREEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glBindTextureEXT"); + if (NULL == GLH_EXT_NAME(glBindTextureEXT)) + return GL_FALSE; + GLH_EXT_NAME(glDeleteTexturesEXT) = (PFNGLDELETETEXTURESEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteTexturesEXT"); + if (NULL == GLH_EXT_NAME(glDeleteTexturesEXT)) + return GL_FALSE; + GLH_EXT_NAME(glGenTexturesEXT) = (PFNGLGENTEXTURESEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glGenTexturesEXT"); + if (NULL == GLH_EXT_NAME(glGenTexturesEXT)) + return GL_FALSE; + GLH_EXT_NAME(glIsTextureEXT) = (PFNGLISTEXTUREEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glIsTextureEXT"); + if (NULL == GLH_EXT_NAME(glIsTextureEXT)) + return GL_FALSE; + GLH_EXT_NAME(glPrioritizeTexturesEXT) = (PFNGLPRIORITIZETEXTURESEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glPrioritizeTexturesEXT"); + if (NULL == GLH_EXT_NAME(glPrioritizeTexturesEXT)) + return GL_FALSE; +#endif + +#ifdef GL_EXT_texture_rectangle + } else if (0 == strcmp(extension, "GL_EXT_texture_rectangle")) { +#endif + +#ifdef GL_EXT_texture3D + } else if (0 == strcmp(extension, "GL_EXT_texture3D")) { + GLH_EXT_NAME(glTexImage3DEXT) = (PFNGLTEXIMAGE3DEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glTexImage3DEXT"); + if (NULL == GLH_EXT_NAME(glTexImage3DEXT)) + return GL_FALSE; +#endif + +#ifdef GL_EXT_vertex_array + } else if (0 == strcmp(extension, "GL_EXT_vertex_array")) { + GLH_EXT_NAME(glArrayElementEXT) = (PFNGLARRAYELEMENTEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glArrayElementEXT"); + if (NULL == GLH_EXT_NAME(glArrayElementEXT)) + return GL_FALSE; + GLH_EXT_NAME(glColorPointerEXT) = (PFNGLCOLORPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glColorPointerEXT"); + if (NULL == GLH_EXT_NAME(glColorPointerEXT)) + return GL_FALSE; + GLH_EXT_NAME(glEdgeFlagPointerEXT) = (PFNGLEDGEFLAGPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glEdgeFlagPointerEXT"); + if (NULL == GLH_EXT_NAME(glEdgeFlagPointerEXT)) + return GL_FALSE; + GLH_EXT_NAME(glGetPointervEXT) = (PFNGLGETPOINTERVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glGetPointervEXT"); + if (NULL == GLH_EXT_NAME(glGetPointervEXT)) + return GL_FALSE; + GLH_EXT_NAME(glIndexPointerEXT) = (PFNGLINDEXPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glIndexPointerEXT"); + if (NULL == GLH_EXT_NAME(glIndexPointerEXT)) + return GL_FALSE; + GLH_EXT_NAME(glNormalPointerEXT) = (PFNGLNORMALPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glNormalPointerEXT"); + if (NULL == GLH_EXT_NAME(glNormalPointerEXT)) + return GL_FALSE; + GLH_EXT_NAME(glTexCoordPointerEXT) = (PFNGLTEXCOORDPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glTexCoordPointerEXT"); + if (NULL == GLH_EXT_NAME(glTexCoordPointerEXT)) + return GL_FALSE; + GLH_EXT_NAME(glVertexPointerEXT) = (PFNGLVERTEXPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexPointerEXT"); + if (NULL == GLH_EXT_NAME(glVertexPointerEXT)) + return GL_FALSE; + GLH_EXT_NAME(glDrawArraysEXT) = (PFNGLDRAWARRAYSEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glDrawArraysEXT"); + if (NULL == GLH_EXT_NAME(glDrawArraysEXT)) + return GL_FALSE; +#endif + +#ifdef GL_EXT_vertex_weighting + } else if (0 == strcmp(extension, "GL_EXT_vertex_weighting")) { + GLH_EXT_NAME(glVertexWeightfEXT) = (PFNGLVERTEXWEIGHTFEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexWeightfEXT"); + if (NULL == GLH_EXT_NAME(glVertexWeightfEXT)) + return GL_FALSE; + GLH_EXT_NAME(glVertexWeightfvEXT) = (PFNGLVERTEXWEIGHTFVEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexWeightfvEXT"); + if (NULL == GLH_EXT_NAME(glVertexWeightfvEXT)) + return GL_FALSE; + GLH_EXT_NAME(glVertexWeightPointerEXT) = (PFNGLVERTEXWEIGHTPOINTEREXTPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexWeightPointerEXT"); + if (NULL == GLH_EXT_NAME(glVertexWeightPointerEXT)) + return GL_FALSE; +#endif + +#ifdef GL_HP_occlusion_test + } else if (0 == strcmp(extension, "GL_HP_occlusion_test")) { +#endif + +#ifdef GL_IBM_texture_mirrored_repeat + } else if (0 == strcmp(extension, "GL_IBM_texture_mirrored_repeat")) { +#endif + +#ifdef GL_NV_blend_square + } else if (0 == strcmp(extension, "GL_NV_blend_square")) { +#endif + +#ifdef GL_NV_copy_depth_to_color + } else if (0 == strcmp(extension, "GL_NV_copy_depth_to_color")) { +#endif + +#ifdef GL_NV_depth_clamp + } else if (0 == strcmp(extension, "GL_NV_depth_clamp")) { +#endif + +#ifdef GL_NV_element_array + } else if (0 == strcmp(extension, "GL_NV_element_array")) { + GLH_EXT_NAME(glElementPointerNV) = (PFNGLELEMENTPOINTERNVPROC)GLH_EXT_GET_PROC_ADDRESS("glElementPointerNV"); + if (NULL == GLH_EXT_NAME(glElementPointerNV)) + return GL_FALSE; + GLH_EXT_NAME(glDrawElementArrayNV) = (PFNGLDRAWELEMENTARRAYNVPROC)GLH_EXT_GET_PROC_ADDRESS("glDrawElementArrayNV"); + if (NULL == GLH_EXT_NAME(glDrawElementArrayNV)) + return GL_FALSE; + GLH_EXT_NAME(glDrawRangeElementArrayNV) = (PFNGLDRAWRANGEELEMENTARRAYNVPROC)GLH_EXT_GET_PROC_ADDRESS("glDrawRangeElementArrayNV"); + if (NULL == GLH_EXT_NAME(glDrawRangeElementArrayNV)) + return GL_FALSE; + GLH_EXT_NAME(glMultiDrawElementArrayNV) = (PFNGLMULTIDRAWELEMENTARRAYNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiDrawElementArrayNV"); + if (NULL == GLH_EXT_NAME(glMultiDrawElementArrayNV)) + return GL_FALSE; + GLH_EXT_NAME(glMultiDrawRangeElementArrayNV) = (PFNGLMULTIDRAWRANGEELEMENTARRAYNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiDrawRangeElementArrayNV"); + if (NULL == GLH_EXT_NAME(glMultiDrawRangeElementArrayNV)) + return GL_FALSE; +#endif + +#ifdef GL_NV_fence + } else if (0 == strcmp(extension, "GL_NV_fence")) { + GLH_EXT_NAME(glGenFencesNV) = (PFNGLGENFENCESNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGenFencesNV"); + if (NULL == GLH_EXT_NAME(glGenFencesNV)) + return GL_FALSE; + GLH_EXT_NAME(glDeleteFencesNV) = (PFNGLDELETEFENCESNVPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteFencesNV"); + if (NULL == GLH_EXT_NAME(glDeleteFencesNV)) + return GL_FALSE; + GLH_EXT_NAME(glSetFenceNV) = (PFNGLSETFENCENVPROC)GLH_EXT_GET_PROC_ADDRESS("glSetFenceNV"); + if (NULL == GLH_EXT_NAME(glSetFenceNV)) + return GL_FALSE; + GLH_EXT_NAME(glTestFenceNV) = (PFNGLTESTFENCENVPROC)GLH_EXT_GET_PROC_ADDRESS("glTestFenceNV"); + if (NULL == GLH_EXT_NAME(glTestFenceNV)) + return GL_FALSE; + GLH_EXT_NAME(glFinishFenceNV) = (PFNGLFINISHFENCENVPROC)GLH_EXT_GET_PROC_ADDRESS("glFinishFenceNV"); + if (NULL == GLH_EXT_NAME(glFinishFenceNV)) + return GL_FALSE; + GLH_EXT_NAME(glIsFenceNV) = (PFNGLISFENCENVPROC)GLH_EXT_GET_PROC_ADDRESS("glIsFenceNV"); + if (NULL == GLH_EXT_NAME(glIsFenceNV)) + return GL_FALSE; + GLH_EXT_NAME(glGetFenceivNV) = (PFNGLGETFENCEIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetFenceivNV"); + if (NULL == GLH_EXT_NAME(glGetFenceivNV)) + return GL_FALSE; +#endif + +#ifdef GL_NV_float_buffer + } else if (0 == strcmp(extension, "GL_NV_float_buffer")) { +#endif + +#ifdef GL_NV_fog_distance + } else if (0 == strcmp(extension, "GL_NV_fog_distance")) { +#endif + +#ifdef GL_NV_fragment_program + } else if (0 == strcmp(extension, "GL_NV_fragment_program")) { + GLH_EXT_NAME(glProgramNamedParameter4fNV) = (PFNGLPROGRAMNAMEDPARAMETER4FNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramNamedParameter4fNV"); + if (NULL == GLH_EXT_NAME(glProgramNamedParameter4fNV)) + return GL_FALSE; + GLH_EXT_NAME(glProgramNamedParameter4dNV) = (PFNGLPROGRAMNAMEDPARAMETER4DNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramNamedParameter4dNV"); + if (NULL == GLH_EXT_NAME(glProgramNamedParameter4dNV)) + return GL_FALSE; + GLH_EXT_NAME(glProgramNamedParameter4fvNV) = (PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramNamedParameter4fvNV"); + if (NULL == GLH_EXT_NAME(glProgramNamedParameter4fvNV)) + return GL_FALSE; + GLH_EXT_NAME(glProgramNamedParameter4dvNV) = (PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramNamedParameter4dvNV"); + if (NULL == GLH_EXT_NAME(glProgramNamedParameter4dvNV)) + return GL_FALSE; + GLH_EXT_NAME(glGetProgramNamedParameterfvNV) = (PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramNamedParameterfvNV"); + if (NULL == GLH_EXT_NAME(glGetProgramNamedParameterfvNV)) + return GL_FALSE; + GLH_EXT_NAME(glGetProgramNamedParameterdvNV) = (PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramNamedParameterdvNV"); + if (NULL == GLH_EXT_NAME(glGetProgramNamedParameterdvNV)) + return GL_FALSE; +#endif + +#ifdef GL_NV_half_float + } else if (0 == strcmp(extension, "GL_NV_half_float")) { + GLH_EXT_NAME(glVertex2hNV) = (PFNGLVERTEX2HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertex2hNV"); + if (NULL == GLH_EXT_NAME(glVertex2hNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertex2hvNV) = (PFNGLVERTEX2HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertex2hvNV"); + if (NULL == GLH_EXT_NAME(glVertex2hvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertex3hNV) = (PFNGLVERTEX3HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertex3hNV"); + if (NULL == GLH_EXT_NAME(glVertex3hNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertex3hvNV) = (PFNGLVERTEX3HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertex3hvNV"); + if (NULL == GLH_EXT_NAME(glVertex3hvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertex4hNV) = (PFNGLVERTEX4HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertex4hNV"); + if (NULL == GLH_EXT_NAME(glVertex4hNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertex4hvNV) = (PFNGLVERTEX4HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertex4hvNV"); + if (NULL == GLH_EXT_NAME(glVertex4hvNV)) + return GL_FALSE; + GLH_EXT_NAME(glNormal3hNV) = (PFNGLNORMAL3HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glNormal3hNV"); + if (NULL == GLH_EXT_NAME(glNormal3hNV)) + return GL_FALSE; + GLH_EXT_NAME(glNormal3hvNV) = (PFNGLNORMAL3HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glNormal3hvNV"); + if (NULL == GLH_EXT_NAME(glNormal3hvNV)) + return GL_FALSE; + GLH_EXT_NAME(glColor3hNV) = (PFNGLCOLOR3HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glColor3hNV"); + if (NULL == GLH_EXT_NAME(glColor3hNV)) + return GL_FALSE; + GLH_EXT_NAME(glColor3hvNV) = (PFNGLCOLOR3HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glColor3hvNV"); + if (NULL == GLH_EXT_NAME(glColor3hvNV)) + return GL_FALSE; + GLH_EXT_NAME(glColor4hNV) = (PFNGLCOLOR4HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glColor4hNV"); + if (NULL == GLH_EXT_NAME(glColor4hNV)) + return GL_FALSE; + GLH_EXT_NAME(glColor4hvNV) = (PFNGLCOLOR4HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glColor4hvNV"); + if (NULL == GLH_EXT_NAME(glColor4hvNV)) + return GL_FALSE; + GLH_EXT_NAME(glTexCoord1hNV) = (PFNGLTEXCOORD1HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glTexCoord1hNV"); + if (NULL == GLH_EXT_NAME(glTexCoord1hNV)) + return GL_FALSE; + GLH_EXT_NAME(glTexCoord1hvNV) = (PFNGLTEXCOORD1HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glTexCoord1hvNV"); + if (NULL == GLH_EXT_NAME(glTexCoord1hvNV)) + return GL_FALSE; + GLH_EXT_NAME(glTexCoord2hNV) = (PFNGLTEXCOORD2HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glTexCoord2hNV"); + if (NULL == GLH_EXT_NAME(glTexCoord2hNV)) + return GL_FALSE; + GLH_EXT_NAME(glTexCoord2hvNV) = (PFNGLTEXCOORD2HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glTexCoord2hvNV"); + if (NULL == GLH_EXT_NAME(glTexCoord2hvNV)) + return GL_FALSE; + GLH_EXT_NAME(glTexCoord3hNV) = (PFNGLTEXCOORD3HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glTexCoord3hNV"); + if (NULL == GLH_EXT_NAME(glTexCoord3hNV)) + return GL_FALSE; + GLH_EXT_NAME(glTexCoord3hvNV) = (PFNGLTEXCOORD3HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glTexCoord3hvNV"); + if (NULL == GLH_EXT_NAME(glTexCoord3hvNV)) + return GL_FALSE; + GLH_EXT_NAME(glTexCoord4hNV) = (PFNGLTEXCOORD4HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glTexCoord4hNV"); + if (NULL == GLH_EXT_NAME(glTexCoord4hNV)) + return GL_FALSE; + GLH_EXT_NAME(glTexCoord4hvNV) = (PFNGLTEXCOORD4HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glTexCoord4hvNV"); + if (NULL == GLH_EXT_NAME(glTexCoord4hvNV)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord1hNV) = (PFNGLMULTITEXCOORD1HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1hNV"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord1hNV)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord1hvNV) = (PFNGLMULTITEXCOORD1HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord1hvNV"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord1hvNV)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord2hNV) = (PFNGLMULTITEXCOORD2HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2hNV"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord2hNV)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord2hvNV) = (PFNGLMULTITEXCOORD2HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord2hvNV"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord2hvNV)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord3hNV) = (PFNGLMULTITEXCOORD3HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3hNV"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord3hNV)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord3hvNV) = (PFNGLMULTITEXCOORD3HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord3hvNV"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord3hvNV)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord4hNV) = (PFNGLMULTITEXCOORD4HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4hNV"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord4hNV)) + return GL_FALSE; + GLH_EXT_NAME(glMultiTexCoord4hvNV) = (PFNGLMULTITEXCOORD4HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glMultiTexCoord4hvNV"); + if (NULL == GLH_EXT_NAME(glMultiTexCoord4hvNV)) + return GL_FALSE; + GLH_EXT_NAME(glFogCoordhNV) = (PFNGLFOGCOORDHNVPROC)GLH_EXT_GET_PROC_ADDRESS("glFogCoordhNV"); + if (NULL == GLH_EXT_NAME(glFogCoordhNV)) + return GL_FALSE; + GLH_EXT_NAME(glFogCoordhvNV) = (PFNGLFOGCOORDHVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glFogCoordhvNV"); + if (NULL == GLH_EXT_NAME(glFogCoordhvNV)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3hNV) = (PFNGLSECONDARYCOLOR3HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3hNV"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3hNV)) + return GL_FALSE; + GLH_EXT_NAME(glSecondaryColor3hvNV) = (PFNGLSECONDARYCOLOR3HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glSecondaryColor3hvNV"); + if (NULL == GLH_EXT_NAME(glSecondaryColor3hvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexWeighthNV) = (PFNGLVERTEXWEIGHTHNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexWeighthNV"); + if (NULL == GLH_EXT_NAME(glVertexWeighthNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexWeighthvNV) = (PFNGLVERTEXWEIGHTHVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexWeighthvNV"); + if (NULL == GLH_EXT_NAME(glVertexWeighthvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib1hNV) = (PFNGLVERTEXATTRIB1HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1hNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib1hNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib1hvNV) = (PFNGLVERTEXATTRIB1HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1hvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib1hvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib2hNV) = (PFNGLVERTEXATTRIB2HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2hNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib2hNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib2hvNV) = (PFNGLVERTEXATTRIB2HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2hvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib2hvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib3hNV) = (PFNGLVERTEXATTRIB3HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3hNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib3hNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib3hvNV) = (PFNGLVERTEXATTRIB3HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3hvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib3hvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4hNV) = (PFNGLVERTEXATTRIB4HNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4hNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4hNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4hvNV) = (PFNGLVERTEXATTRIB4HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4hvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4hvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttribs1hvNV) = (PFNGLVERTEXATTRIBS1HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs1hvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttribs1hvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttribs2hvNV) = (PFNGLVERTEXATTRIBS2HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs2hvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttribs2hvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttribs3hvNV) = (PFNGLVERTEXATTRIBS3HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs3hvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttribs3hvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttribs4hvNV) = (PFNGLVERTEXATTRIBS4HVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs4hvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttribs4hvNV)) + return GL_FALSE; +#endif + +#ifdef GL_NV_light_max_exponent + } else if (0 == strcmp(extension, "GL_NV_light_max_exponent")) { +#endif + +#ifdef GL_NV_multisample_filter_hint + } else if (0 == strcmp(extension, "GL_NV_multisample_filter_hint")) { +#endif + +#ifdef GL_NV_occlusion_query + } else if (0 == strcmp(extension, "GL_NV_occlusion_query")) { + GLH_EXT_NAME(glGenOcclusionQueriesNV) = (PFNGLGENOCCLUSIONQUERIESNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGenOcclusionQueriesNV"); + if (NULL == GLH_EXT_NAME(glGenOcclusionQueriesNV)) + return GL_FALSE; + GLH_EXT_NAME(glDeleteOcclusionQueriesNV) = (PFNGLDELETEOCCLUSIONQUERIESNVPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteOcclusionQueriesNV"); + if (NULL == GLH_EXT_NAME(glDeleteOcclusionQueriesNV)) + return GL_FALSE; + GLH_EXT_NAME(glIsOcclusionQueryNV) = (PFNGLISOCCLUSIONQUERYNVPROC)GLH_EXT_GET_PROC_ADDRESS("glIsOcclusionQueryNV"); + if (NULL == GLH_EXT_NAME(glIsOcclusionQueryNV)) + return GL_FALSE; + GLH_EXT_NAME(glBeginOcclusionQueryNV) = (PFNGLBEGINOCCLUSIONQUERYNVPROC)GLH_EXT_GET_PROC_ADDRESS("glBeginOcclusionQueryNV"); + if (NULL == GLH_EXT_NAME(glBeginOcclusionQueryNV)) + return GL_FALSE; + GLH_EXT_NAME(glEndOcclusionQueryNV) = (PFNGLENDOCCLUSIONQUERYNVPROC)GLH_EXT_GET_PROC_ADDRESS("glEndOcclusionQueryNV"); + if (NULL == GLH_EXT_NAME(glEndOcclusionQueryNV)) + return GL_FALSE; + GLH_EXT_NAME(glGetOcclusionQueryivNV) = (PFNGLGETOCCLUSIONQUERYIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetOcclusionQueryivNV"); + if (NULL == GLH_EXT_NAME(glGetOcclusionQueryivNV)) + return GL_FALSE; + GLH_EXT_NAME(glGetOcclusionQueryuivNV) = (PFNGLGETOCCLUSIONQUERYUIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetOcclusionQueryuivNV"); + if (NULL == GLH_EXT_NAME(glGetOcclusionQueryuivNV)) + return GL_FALSE; +#endif + +#ifdef GL_NV_packed_depth_stencil + } else if (0 == strcmp(extension, "GL_NV_packed_depth_stencil")) { +#endif + +#ifdef GL_NV_pixel_data_range + } else if (0 == strcmp(extension, "GL_NV_pixel_data_range")) { + GLH_EXT_NAME(glPixelDataRangeNV) = (PFNGLPIXELDATARANGENVPROC)GLH_EXT_GET_PROC_ADDRESS("glPixelDataRangeNV"); + if (NULL == GLH_EXT_NAME(glPixelDataRangeNV)) + return GL_FALSE; + GLH_EXT_NAME(glFlushPixelDataRangeNV) = (PFNGLFLUSHPIXELDATARANGENVPROC)GLH_EXT_GET_PROC_ADDRESS("glFlushPixelDataRangeNV"); + if (NULL == GLH_EXT_NAME(glFlushPixelDataRangeNV)) + return GL_FALSE; +#endif + +#ifdef GL_NV_point_sprite + } else if (0 == strcmp(extension, "GL_NV_point_sprite")) { + GLH_EXT_NAME(glPointParameteriNV) = (PFNGLPOINTPARAMETERINVPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameteriNV"); + if (NULL == GLH_EXT_NAME(glPointParameteriNV)) + return GL_FALSE; + GLH_EXT_NAME(glPointParameterivNV) = (PFNGLPOINTPARAMETERIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterivNV"); + if (NULL == GLH_EXT_NAME(glPointParameterivNV)) + return GL_FALSE; +#endif + +#ifdef GL_NV_primitive_restart + } else if (0 == strcmp(extension, "GL_NV_primitive_restart")) { + GLH_EXT_NAME(glPrimitiveRestartNV) = (PFNGLPRIMITIVERESTARTNVPROC)GLH_EXT_GET_PROC_ADDRESS("glPrimitiveRestartNV"); + if (NULL == GLH_EXT_NAME(glPrimitiveRestartNV)) + return GL_FALSE; + GLH_EXT_NAME(glPrimitiveRestartIndexNV) = (PFNGLPRIMITIVERESTARTINDEXNVPROC)GLH_EXT_GET_PROC_ADDRESS("glPrimitiveRestartIndexNV"); + if (NULL == GLH_EXT_NAME(glPrimitiveRestartIndexNV)) + return GL_FALSE; +#endif + +#ifdef GL_NV_register_combiners + } else if (0 == strcmp(extension, "GL_NV_register_combiners")) { + GLH_EXT_NAME(glCombinerParameterfvNV) = (PFNGLCOMBINERPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glCombinerParameterfvNV"); + if (NULL == GLH_EXT_NAME(glCombinerParameterfvNV)) + return GL_FALSE; + GLH_EXT_NAME(glCombinerParameterfNV) = (PFNGLCOMBINERPARAMETERFNVPROC)GLH_EXT_GET_PROC_ADDRESS("glCombinerParameterfNV"); + if (NULL == GLH_EXT_NAME(glCombinerParameterfNV)) + return GL_FALSE; + GLH_EXT_NAME(glCombinerParameterivNV) = (PFNGLCOMBINERPARAMETERIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glCombinerParameterivNV"); + if (NULL == GLH_EXT_NAME(glCombinerParameterivNV)) + return GL_FALSE; + GLH_EXT_NAME(glCombinerParameteriNV) = (PFNGLCOMBINERPARAMETERINVPROC)GLH_EXT_GET_PROC_ADDRESS("glCombinerParameteriNV"); + if (NULL == GLH_EXT_NAME(glCombinerParameteriNV)) + return GL_FALSE; + GLH_EXT_NAME(glCombinerInputNV) = (PFNGLCOMBINERINPUTNVPROC)GLH_EXT_GET_PROC_ADDRESS("glCombinerInputNV"); + if (NULL == GLH_EXT_NAME(glCombinerInputNV)) + return GL_FALSE; + GLH_EXT_NAME(glCombinerOutputNV) = (PFNGLCOMBINEROUTPUTNVPROC)GLH_EXT_GET_PROC_ADDRESS("glCombinerOutputNV"); + if (NULL == GLH_EXT_NAME(glCombinerOutputNV)) + return GL_FALSE; + GLH_EXT_NAME(glFinalCombinerInputNV) = (PFNGLFINALCOMBINERINPUTNVPROC)GLH_EXT_GET_PROC_ADDRESS("glFinalCombinerInputNV"); + if (NULL == GLH_EXT_NAME(glFinalCombinerInputNV)) + return GL_FALSE; + GLH_EXT_NAME(glGetCombinerInputParameterfvNV) = (PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetCombinerInputParameterfvNV"); + if (NULL == GLH_EXT_NAME(glGetCombinerInputParameterfvNV)) + return GL_FALSE; + GLH_EXT_NAME(glGetCombinerInputParameterivNV) = (PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetCombinerInputParameterivNV"); + if (NULL == GLH_EXT_NAME(glGetCombinerInputParameterivNV)) + return GL_FALSE; + GLH_EXT_NAME(glGetCombinerOutputParameterfvNV) = (PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetCombinerOutputParameterfvNV"); + if (NULL == GLH_EXT_NAME(glGetCombinerOutputParameterfvNV)) + return GL_FALSE; + GLH_EXT_NAME(glGetCombinerOutputParameterivNV) = (PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetCombinerOutputParameterivNV"); + if (NULL == GLH_EXT_NAME(glGetCombinerOutputParameterivNV)) + return GL_FALSE; + GLH_EXT_NAME(glGetFinalCombinerInputParameterfvNV) = (PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetFinalCombinerInputParameterfvNV"); + if (NULL == GLH_EXT_NAME(glGetFinalCombinerInputParameterfvNV)) + return GL_FALSE; + GLH_EXT_NAME(glGetFinalCombinerInputParameterivNV) = (PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetFinalCombinerInputParameterivNV"); + if (NULL == GLH_EXT_NAME(glGetFinalCombinerInputParameterivNV)) + return GL_FALSE; +#endif + +#ifdef GL_NV_register_combiners2 + } else if (0 == strcmp(extension, "GL_NV_register_combiners2")) { + GLH_EXT_NAME(glCombinerStageParameterfvNV) = (PFNGLCOMBINERSTAGEPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glCombinerStageParameterfvNV"); + if (NULL == GLH_EXT_NAME(glCombinerStageParameterfvNV)) + return GL_FALSE; + GLH_EXT_NAME(glGetCombinerStageParameterfvNV) = (PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetCombinerStageParameterfvNV"); + if (NULL == GLH_EXT_NAME(glGetCombinerStageParameterfvNV)) + return GL_FALSE; +#endif + +#ifdef GL_NV_stencil_two_side + } else if (0 == strcmp(extension, "GL_NV_stencil_two_side")) { + GLH_EXT_NAME(glActiveStencilFaceNV) = (PFNGLACTIVESTENCILFACENVPROC)GLH_EXT_GET_PROC_ADDRESS("glActiveStencilFaceNV"); + if (NULL == GLH_EXT_NAME(glActiveStencilFaceNV)) + return GL_FALSE; +#endif + +#ifdef GL_NV_texgen_reflection + } else if (0 == strcmp(extension, "GL_NV_texgen_reflection")) { +#endif + +#ifdef GL_NV_texture_compression_vtc + } else if (0 == strcmp(extension, "GL_NV_texture_compression_vtc")) { +#endif + +#ifdef GL_NV_texture_env_combine4 + } else if (0 == strcmp(extension, "GL_NV_texture_env_combine4")) { +#endif + +#ifdef GL_NV_texture_rectangle + } else if (0 == strcmp(extension, "GL_NV_texture_rectangle")) { +#endif + +#ifdef GL_NV_texture_shader + } else if (0 == strcmp(extension, "GL_NV_texture_shader")) { +#endif + +#ifdef GL_NV_texture_shader2 + } else if (0 == strcmp(extension, "GL_NV_texture_shader2")) { +#endif + +#ifdef GL_NV_texture_shader3 + } else if (0 == strcmp(extension, "GL_NV_texture_shader3")) { +#endif + +#ifdef GL_NV_vertex_array_range + } else if (0 == strcmp(extension, "GL_NV_vertex_array_range")) { + GLH_EXT_NAME(glFlushVertexArrayRangeNV) = (PFNGLFLUSHVERTEXARRAYRANGENVPROC)GLH_EXT_GET_PROC_ADDRESS("glFlushVertexArrayRangeNV"); + if (NULL == GLH_EXT_NAME(glFlushVertexArrayRangeNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexArrayRangeNV) = (PFNGLVERTEXARRAYRANGENVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexArrayRangeNV"); + if (NULL == GLH_EXT_NAME(glVertexArrayRangeNV)) + return GL_FALSE; +# ifdef _WIN32 + GLH_EXT_NAME(wglAllocateMemoryNV) = (PFNWGLALLOCATEMEMORYNVPROC)GLH_EXT_GET_PROC_ADDRESS("wglAllocateMemoryNV"); + if (NULL == GLH_EXT_NAME(wglAllocateMemoryNV)) + return GL_FALSE; +# endif +# ifdef GLX_VERSION_1_3 + GLH_EXT_NAME(glXAllocateMemoryNV) = (PFNGLXALLOCATEMEMORYNVPROC)GLH_EXT_GET_PROC_ADDRESS("glXAllocateMemoryNV"); + if (NULL == GLH_EXT_NAME(glXAllocateMemoryNV)) + return GL_FALSE; +# endif +# ifdef _WIN32 + GLH_EXT_NAME(wglFreeMemoryNV) = (PFNWGLFREEMEMORYNVPROC)GLH_EXT_GET_PROC_ADDRESS("wglFreeMemoryNV"); + if (NULL == GLH_EXT_NAME(wglFreeMemoryNV)) + return GL_FALSE; +# endif +# ifdef GLX_VERSION_1_3 + GLH_EXT_NAME(glXFreeMemoryNV) = (PFNGLXFREEMEMORYNVPROC)GLH_EXT_GET_PROC_ADDRESS("glXFreeMemoryNV"); + if (NULL == GLH_EXT_NAME(glXFreeMemoryNV)) + return GL_FALSE; +# endif +#endif + +#ifdef GL_NV_vertex_array_range2 + } else if (0 == strcmp(extension, "GL_NV_vertex_array_range2")) { +#endif + +#ifdef GL_NV_vertex_program + } else if (0 == strcmp(extension, "GL_NV_vertex_program")) { + GLH_EXT_NAME(glAreProgramsResidentNV) = (PFNGLAREPROGRAMSRESIDENTNVPROC)GLH_EXT_GET_PROC_ADDRESS("glAreProgramsResidentNV"); + if (NULL == GLH_EXT_NAME(glAreProgramsResidentNV)) + return GL_FALSE; + GLH_EXT_NAME(glBindProgramNV) = (PFNGLBINDPROGRAMNVPROC)GLH_EXT_GET_PROC_ADDRESS("glBindProgramNV"); + if (NULL == GLH_EXT_NAME(glBindProgramNV)) + return GL_FALSE; + GLH_EXT_NAME(glDeleteProgramsNV) = (PFNGLDELETEPROGRAMSNVPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteProgramsNV"); + if (NULL == GLH_EXT_NAME(glDeleteProgramsNV)) + return GL_FALSE; + GLH_EXT_NAME(glExecuteProgramNV) = (PFNGLEXECUTEPROGRAMNVPROC)GLH_EXT_GET_PROC_ADDRESS("glExecuteProgramNV"); + if (NULL == GLH_EXT_NAME(glExecuteProgramNV)) + return GL_FALSE; + GLH_EXT_NAME(glGenProgramsNV) = (PFNGLGENPROGRAMSNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGenProgramsNV"); + if (NULL == GLH_EXT_NAME(glGenProgramsNV)) + return GL_FALSE; + GLH_EXT_NAME(glGetProgramParameterdvNV) = (PFNGLGETPROGRAMPARAMETERDVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramParameterdvNV"); + if (NULL == GLH_EXT_NAME(glGetProgramParameterdvNV)) + return GL_FALSE; + GLH_EXT_NAME(glGetProgramParameterfvNV) = (PFNGLGETPROGRAMPARAMETERFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramParameterfvNV"); + if (NULL == GLH_EXT_NAME(glGetProgramParameterfvNV)) + return GL_FALSE; + GLH_EXT_NAME(glGetProgramivNV) = (PFNGLGETPROGRAMIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramivNV"); + if (NULL == GLH_EXT_NAME(glGetProgramivNV)) + return GL_FALSE; + GLH_EXT_NAME(glGetProgramStringNV) = (PFNGLGETPROGRAMSTRINGNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetProgramStringNV"); + if (NULL == GLH_EXT_NAME(glGetProgramStringNV)) + return GL_FALSE; + GLH_EXT_NAME(glGetTrackMatrixivNV) = (PFNGLGETTRACKMATRIXIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetTrackMatrixivNV"); + if (NULL == GLH_EXT_NAME(glGetTrackMatrixivNV)) + return GL_FALSE; + GLH_EXT_NAME(glGetVertexAttribdvNV) = (PFNGLGETVERTEXATTRIBDVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribdvNV"); + if (NULL == GLH_EXT_NAME(glGetVertexAttribdvNV)) + return GL_FALSE; + GLH_EXT_NAME(glGetVertexAttribfvNV) = (PFNGLGETVERTEXATTRIBFVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribfvNV"); + if (NULL == GLH_EXT_NAME(glGetVertexAttribfvNV)) + return GL_FALSE; + GLH_EXT_NAME(glGetVertexAttribivNV) = (PFNGLGETVERTEXATTRIBIVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribivNV"); + if (NULL == GLH_EXT_NAME(glGetVertexAttribivNV)) + return GL_FALSE; + GLH_EXT_NAME(glGetVertexAttribPointervNV) = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glGetVertexAttribPointervNV"); + if (NULL == GLH_EXT_NAME(glGetVertexAttribPointervNV)) + return GL_FALSE; + GLH_EXT_NAME(glIsProgramNV) = (PFNGLISPROGRAMNVPROC)GLH_EXT_GET_PROC_ADDRESS("glIsProgramNV"); + if (NULL == GLH_EXT_NAME(glIsProgramNV)) + return GL_FALSE; + GLH_EXT_NAME(glLoadProgramNV) = (PFNGLLOADPROGRAMNVPROC)GLH_EXT_GET_PROC_ADDRESS("glLoadProgramNV"); + if (NULL == GLH_EXT_NAME(glLoadProgramNV)) + return GL_FALSE; + GLH_EXT_NAME(glProgramParameter4dNV) = (PFNGLPROGRAMPARAMETER4DNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramParameter4dNV"); + if (NULL == GLH_EXT_NAME(glProgramParameter4dNV)) + return GL_FALSE; + GLH_EXT_NAME(glProgramParameter4dvNV) = (PFNGLPROGRAMPARAMETER4DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramParameter4dvNV"); + if (NULL == GLH_EXT_NAME(glProgramParameter4dvNV)) + return GL_FALSE; + GLH_EXT_NAME(glProgramParameter4fNV) = (PFNGLPROGRAMPARAMETER4FNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramParameter4fNV"); + if (NULL == GLH_EXT_NAME(glProgramParameter4fNV)) + return GL_FALSE; + GLH_EXT_NAME(glProgramParameter4fvNV) = (PFNGLPROGRAMPARAMETER4FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramParameter4fvNV"); + if (NULL == GLH_EXT_NAME(glProgramParameter4fvNV)) + return GL_FALSE; + GLH_EXT_NAME(glProgramParameters4dvNV) = (PFNGLPROGRAMPARAMETERS4DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramParameters4dvNV"); + if (NULL == GLH_EXT_NAME(glProgramParameters4dvNV)) + return GL_FALSE; + GLH_EXT_NAME(glProgramParameters4fvNV) = (PFNGLPROGRAMPARAMETERS4FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glProgramParameters4fvNV"); + if (NULL == GLH_EXT_NAME(glProgramParameters4fvNV)) + return GL_FALSE; + GLH_EXT_NAME(glRequestResidentProgramsNV) = (PFNGLREQUESTRESIDENTPROGRAMSNVPROC)GLH_EXT_GET_PROC_ADDRESS("glRequestResidentProgramsNV"); + if (NULL == GLH_EXT_NAME(glRequestResidentProgramsNV)) + return GL_FALSE; + GLH_EXT_NAME(glTrackMatrixNV) = (PFNGLTRACKMATRIXNVPROC)GLH_EXT_GET_PROC_ADDRESS("glTrackMatrixNV"); + if (NULL == GLH_EXT_NAME(glTrackMatrixNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttribPointerNV) = (PFNGLVERTEXATTRIBPOINTERNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribPointerNV"); + if (NULL == GLH_EXT_NAME(glVertexAttribPointerNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib1dNV) = (PFNGLVERTEXATTRIB1DNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1dNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib1dNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib1dvNV) = (PFNGLVERTEXATTRIB1DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1dvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib1dvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib1fNV) = (PFNGLVERTEXATTRIB1FNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1fNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib1fNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib1fvNV) = (PFNGLVERTEXATTRIB1FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1fvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib1fvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib1sNV) = (PFNGLVERTEXATTRIB1SNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1sNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib1sNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib1svNV) = (PFNGLVERTEXATTRIB1SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1svNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib1svNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib2dNV) = (PFNGLVERTEXATTRIB2DNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2dNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib2dNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib2dvNV) = (PFNGLVERTEXATTRIB2DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2dvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib2dvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib2fNV) = (PFNGLVERTEXATTRIB2FNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2fNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib2fNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib2fvNV) = (PFNGLVERTEXATTRIB2FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2fvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib2fvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib2sNV) = (PFNGLVERTEXATTRIB2SNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2sNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib2sNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib2svNV) = (PFNGLVERTEXATTRIB2SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib2svNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib2svNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib3dNV) = (PFNGLVERTEXATTRIB3DNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3dNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib3dNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib3dvNV) = (PFNGLVERTEXATTRIB3DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3dvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib3dvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib3fNV) = (PFNGLVERTEXATTRIB3FNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3fNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib3fNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib3fvNV) = (PFNGLVERTEXATTRIB3FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3fvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib3fvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib3sNV) = (PFNGLVERTEXATTRIB3SNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3sNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib3sNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib3svNV) = (PFNGLVERTEXATTRIB3SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib3svNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib3svNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4dNV) = (PFNGLVERTEXATTRIB4DNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4dNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4dNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4dvNV) = (PFNGLVERTEXATTRIB4DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4dvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4dvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4fNV) = (PFNGLVERTEXATTRIB4FNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4fNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4fNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4fvNV) = (PFNGLVERTEXATTRIB4FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4fvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4fvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4sNV) = (PFNGLVERTEXATTRIB4SNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4sNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4sNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4svNV) = (PFNGLVERTEXATTRIB4SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4svNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4svNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttrib4ubvNV) = (PFNGLVERTEXATTRIB4UBVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4ubvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttrib4ubvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttribs1dvNV) = (PFNGLVERTEXATTRIBS1DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs1dvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttribs1dvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttribs1fvNV) = (PFNGLVERTEXATTRIBS1FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs1fvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttribs1fvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttribs1svNV) = (PFNGLVERTEXATTRIBS1SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs1svNV"); + if (NULL == GLH_EXT_NAME(glVertexAttribs1svNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttribs2dvNV) = (PFNGLVERTEXATTRIBS2DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs2dvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttribs2dvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttribs2fvNV) = (PFNGLVERTEXATTRIBS2FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs2fvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttribs2fvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttribs2svNV) = (PFNGLVERTEXATTRIBS2SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs2svNV"); + if (NULL == GLH_EXT_NAME(glVertexAttribs2svNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttribs3dvNV) = (PFNGLVERTEXATTRIBS3DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs3dvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttribs3dvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttribs3fvNV) = (PFNGLVERTEXATTRIBS3FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs3fvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttribs3fvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttribs3svNV) = (PFNGLVERTEXATTRIBS3SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs3svNV"); + if (NULL == GLH_EXT_NAME(glVertexAttribs3svNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttribs4dvNV) = (PFNGLVERTEXATTRIBS4DVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs4dvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttribs4dvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttribs4fvNV) = (PFNGLVERTEXATTRIBS4FVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs4fvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttribs4fvNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttribs4svNV) = (PFNGLVERTEXATTRIBS4SVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs4svNV"); + if (NULL == GLH_EXT_NAME(glVertexAttribs4svNV)) + return GL_FALSE; + GLH_EXT_NAME(glVertexAttribs4ubvNV) = (PFNGLVERTEXATTRIBS4UBVNVPROC)GLH_EXT_GET_PROC_ADDRESS("glVertexAttribs4ubvNV"); + if (NULL == GLH_EXT_NAME(glVertexAttribs4ubvNV)) + return GL_FALSE; +#endif + +#ifdef GL_NV_vertex_program1_1 + } else if (0 == strcmp(extension, "GL_NV_vertex_program1_1")) { +#endif + +#ifdef GL_NV_vertex_program2 + } else if (0 == strcmp(extension, "GL_NV_vertex_program2")) { +#endif + +#ifdef GL_SGIS_generate_mipmap + } else if (0 == strcmp(extension, "GL_SGIS_generate_mipmap")) { +#endif + +#ifdef GL_SGIS_texture_lod + } else if (0 == strcmp(extension, "GL_SGIS_texture_lod")) { +#endif + +#ifdef GL_SGIX_depth_texture + } else if (0 == strcmp(extension, "GL_SGIX_depth_texture")) { +#endif + +#ifdef GL_SGIX_shadow + } else if (0 == strcmp(extension, "GL_SGIX_shadow")) { +#endif + +#ifdef GL_WIN_swap_hint + } else if (0 == strcmp(extension, "GL_WIN_swap_hint")) { + GLH_EXT_NAME(glAddSwapHintRectWIN) = (PFNGLADDSWAPHINTRECTWINPROC)GLH_EXT_GET_PROC_ADDRESS("glAddSwapHintRectWIN"); + if (NULL == GLH_EXT_NAME(glAddSwapHintRectWIN)) + return GL_FALSE; +#endif + +#ifdef WGL_ARB_buffer_region + } else if (0 == strcmp(extension, "WGL_ARB_buffer_region")) { +# ifdef _WIN32 + GLH_EXT_NAME(wglCreateBufferRegionARB) = (PFNWGLCREATEBUFFERREGIONARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglCreateBufferRegionARB"); + if (NULL == GLH_EXT_NAME(wglCreateBufferRegionARB)) + return GL_FALSE; +# endif +# ifdef _WIN32 + GLH_EXT_NAME(wglDeleteBufferRegionARB) = (PFNWGLDELETEBUFFERREGIONARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglDeleteBufferRegionARB"); + if (NULL == GLH_EXT_NAME(wglDeleteBufferRegionARB)) + return GL_FALSE; +# endif +# ifdef _WIN32 + GLH_EXT_NAME(wglSaveBufferRegionARB) = (PFNWGLSAVEBUFFERREGIONARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglSaveBufferRegionARB"); + if (NULL == GLH_EXT_NAME(wglSaveBufferRegionARB)) + return GL_FALSE; +# endif +# ifdef _WIN32 + GLH_EXT_NAME(wglRestoreBufferRegionARB) = (PFNWGLRESTOREBUFFERREGIONARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglRestoreBufferRegionARB"); + if (NULL == GLH_EXT_NAME(wglRestoreBufferRegionARB)) + return GL_FALSE; +# endif +#endif + +#ifdef WGL_ARB_extensions_string + } else if (0 == strcmp(extension, "WGL_ARB_extensions_string")) { +# ifdef _WIN32 + GLH_EXT_NAME(wglGetExtensionsStringARB) = (PFNWGLGETEXTENSIONSSTRINGARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglGetExtensionsStringARB"); + if (NULL == GLH_EXT_NAME(wglGetExtensionsStringARB)) + return GL_FALSE; +# endif +#endif + +#ifdef WGL_ARB_pbuffer + } else if (0 == strcmp(extension, "WGL_ARB_pbuffer")) { +# ifdef _WIN32 + GLH_EXT_NAME(wglCreatePbufferARB) = (PFNWGLCREATEPBUFFERARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglCreatePbufferARB"); + if (NULL == GLH_EXT_NAME(wglCreatePbufferARB)) + return GL_FALSE; +# endif +# ifdef _WIN32 + GLH_EXT_NAME(wglGetPbufferDCARB) = (PFNWGLGETPBUFFERDCARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglGetPbufferDCARB"); + if (NULL == GLH_EXT_NAME(wglGetPbufferDCARB)) + return GL_FALSE; +# endif +# ifdef _WIN32 + GLH_EXT_NAME(wglReleasePbufferDCARB) = (PFNWGLRELEASEPBUFFERDCARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglReleasePbufferDCARB"); + if (NULL == GLH_EXT_NAME(wglReleasePbufferDCARB)) + return GL_FALSE; +# endif +# ifdef _WIN32 + GLH_EXT_NAME(wglDestroyPbufferARB) = (PFNWGLDESTROYPBUFFERARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglDestroyPbufferARB"); + if (NULL == GLH_EXT_NAME(wglDestroyPbufferARB)) + return GL_FALSE; +# endif +# ifdef _WIN32 + GLH_EXT_NAME(wglQueryPbufferARB) = (PFNWGLQUERYPBUFFERARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglQueryPbufferARB"); + if (NULL == GLH_EXT_NAME(wglQueryPbufferARB)) + return GL_FALSE; +# endif +#endif + +#ifdef WGL_ARB_pixel_format + } else if (0 == strcmp(extension, "WGL_ARB_pixel_format")) { +# ifdef _WIN32 + GLH_EXT_NAME(wglGetPixelFormatAttribivARB) = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglGetPixelFormatAttribivARB"); + if (NULL == GLH_EXT_NAME(wglGetPixelFormatAttribivARB)) + return GL_FALSE; +# endif +# ifdef _WIN32 + GLH_EXT_NAME(wglGetPixelFormatAttribfvARB) = (PFNWGLGETPIXELFORMATATTRIBFVARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglGetPixelFormatAttribfvARB"); + if (NULL == GLH_EXT_NAME(wglGetPixelFormatAttribfvARB)) + return GL_FALSE; +# endif +# ifdef _WIN32 + GLH_EXT_NAME(wglChoosePixelFormatARB) = (PFNWGLCHOOSEPIXELFORMATARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglChoosePixelFormatARB"); + if (NULL == GLH_EXT_NAME(wglChoosePixelFormatARB)) + return GL_FALSE; +# endif +#endif + +#ifdef WGL_ARB_render_texture + } else if (0 == strcmp(extension, "WGL_ARB_render_texture")) { +# ifdef _WIN32 + GLH_EXT_NAME(wglBindTexImageARB) = (PFNWGLBINDTEXIMAGEARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglBindTexImageARB"); + if (NULL == GLH_EXT_NAME(wglBindTexImageARB)) + return GL_FALSE; +# endif +# ifdef _WIN32 + GLH_EXT_NAME(wglReleaseTexImageARB) = (PFNWGLRELEASETEXIMAGEARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglReleaseTexImageARB"); + if (NULL == GLH_EXT_NAME(wglReleaseTexImageARB)) + return GL_FALSE; +# endif +# ifdef _WIN32 + GLH_EXT_NAME(wglSetPbufferAttribARB) = (PFNWGLSETPBUFFERATTRIBARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglSetPbufferAttribARB"); + if (NULL == GLH_EXT_NAME(wglSetPbufferAttribARB)) + return GL_FALSE; +# endif +#endif + +#ifdef WGL_EXT_extensions_string + } else if (0 == strcmp(extension, "WGL_EXT_extensions_string")) { +# ifdef _WIN32 + GLH_EXT_NAME(wglGetExtensionsStringEXT) = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)GLH_EXT_GET_PROC_ADDRESS("wglGetExtensionsStringEXT"); + if (NULL == GLH_EXT_NAME(wglGetExtensionsStringEXT)) + return GL_FALSE; +# endif +#endif + +#ifdef WGL_EXT_swap_control + } else if (0 == strcmp(extension, "WGL_EXT_swap_control")) { +# ifdef _WIN32 + GLH_EXT_NAME(wglSwapIntervalEXT) = (PFNWGLSWAPINTERVALEXTPROC)GLH_EXT_GET_PROC_ADDRESS("wglSwapIntervalEXT"); + if (NULL == GLH_EXT_NAME(wglSwapIntervalEXT)) + return GL_FALSE; +# endif +# ifdef _WIN32 + GLH_EXT_NAME(wglGetSwapIntervalEXT) = (PFNWGLGETSWAPINTERVALEXTPROC)GLH_EXT_GET_PROC_ADDRESS("wglGetSwapIntervalEXT"); + if (NULL == GLH_EXT_NAME(wglGetSwapIntervalEXT)) + return GL_FALSE; +# endif +#endif + +#ifdef WGL_NV_float_buffer + } else if (0 == strcmp(extension, "WGL_NV_float_buffer")) { +#endif + +#ifdef WGL_NV_render_depth_texture + } else if (0 == strcmp(extension, "WGL_NV_render_depth_texture")) { +#endif + +#ifdef WGL_NV_render_texture_rectangle + } else if (0 == strcmp(extension, "WGL_NV_render_texture_rectangle")) { +#endif + +#ifdef GLX_SGIX_pbuffer + } else if (0 == strcmp(extension, "GLX_SGIX_pbuffer")) { +# ifdef GLX_VERSION_1_3 + GLH_EXT_NAME(glXCreateGLXPbufferSGIX) = (PFNGLXCREATEGLXPBUFFERSGIXPROC)GLH_EXT_GET_PROC_ADDRESS("glXCreateGLXPbufferSGIX"); + if (NULL == GLH_EXT_NAME(glXCreateGLXPbufferSGIX)) + return GL_FALSE; +# endif +# ifdef GLX_VERSION_1_3 + GLH_EXT_NAME(glXDestroyGLXPbufferSGIX) = (PFNGLXDESTROYGLXPBUFFERSGIXPROC)GLH_EXT_GET_PROC_ADDRESS("glXDestroyGLXPbufferSGIX"); + if (NULL == GLH_EXT_NAME(glXDestroyGLXPbufferSGIX)) + return GL_FALSE; +# endif +# ifdef GLX_VERSION_1_3 + GLH_EXT_NAME(glXQueryGLXPbufferSGIX) = (PFNGLXQUERYGLXPBUFFERSGIXPROC)GLH_EXT_GET_PROC_ADDRESS("glXQueryGLXPbufferSGIX"); + if (NULL == GLH_EXT_NAME(glXQueryGLXPbufferSGIX)) + return GL_FALSE; +# endif +# ifdef GLX_VERSION_1_3 + GLH_EXT_NAME(glXSelectEventSGIX) = (PFNGLXSELECTEVENTSGIXPROC)GLH_EXT_GET_PROC_ADDRESS("glXSelectEventSGIX"); + if (NULL == GLH_EXT_NAME(glXSelectEventSGIX)) + return GL_FALSE; +# endif +# ifdef GLX_VERSION_1_3 + GLH_EXT_NAME(glXGetSelectedEventSGIX) = (PFNGLXGETSELECTEDEVENTSGIXPROC)GLH_EXT_GET_PROC_ADDRESS("glXGetSelectedEventSGIX"); + if (NULL == GLH_EXT_NAME(glXGetSelectedEventSGIX)) + return GL_FALSE; +# endif +#endif + +#ifdef GLX_SGIX_fbconfig + } else if (0 == strcmp(extension, "GLX_SGIX_fbconfig")) { +# ifdef GLX_VERSION_1_3 + GLH_EXT_NAME(glXGetFBConfigAttribSGIX) = (PFNGLXGETFBCONFIGATTRIBSGIXPROC)GLH_EXT_GET_PROC_ADDRESS("glXGetFBConfigAttribSGIX"); + if (NULL == GLH_EXT_NAME(glXGetFBConfigAttribSGIX)) + return GL_FALSE; +# endif +# ifdef GLX_VERSION_1_3 + GLH_EXT_NAME(glXChooseFBConfigSGIX) = (PFNGLXCHOOSEFBCONFIGSGIXPROC)GLH_EXT_GET_PROC_ADDRESS("glXChooseFBConfigSGIX"); + if (NULL == GLH_EXT_NAME(glXChooseFBConfigSGIX)) + return GL_FALSE; +# endif +# ifdef GLX_VERSION_1_3 + GLH_EXT_NAME(glXCreateGLXPixmapWithConfigSGIX) = (PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC)GLH_EXT_GET_PROC_ADDRESS("glXCreateGLXPixmapWithConfigSGIX"); + if (NULL == GLH_EXT_NAME(glXCreateGLXPixmapWithConfigSGIX)) + return GL_FALSE; +# endif +# ifdef GLX_VERSION_1_3 + GLH_EXT_NAME(glXCreateContextWithConfigSGIX) = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC)GLH_EXT_GET_PROC_ADDRESS("glXCreateContextWithConfigSGIX"); + if (NULL == GLH_EXT_NAME(glXCreateContextWithConfigSGIX)) + return GL_FALSE; +# endif +# ifdef GLX_VERSION_1_3 + GLH_EXT_NAME(glXGetVisualFromFBConfigSGIX) = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC)GLH_EXT_GET_PROC_ADDRESS("glXGetVisualFromFBConfigSGIX"); + if (NULL == GLH_EXT_NAME(glXGetVisualFromFBConfigSGIX)) + return GL_FALSE; +# endif +# ifdef GLX_VERSION_1_3 + GLH_EXT_NAME(glXGetFBConfigFromVisualSGIX) = (PFNGLXGETFBCONFIGFROMVISUALSGIXPROC)GLH_EXT_GET_PROC_ADDRESS("glXGetFBConfigFromVisualSGIX"); + if (NULL == GLH_EXT_NAME(glXGetFBConfigFromVisualSGIX)) + return GL_FALSE; +# endif +#endif + + } else { + return GL_FALSE; + } + return GL_TRUE; +} +#endif + +#undef GLH_EXT_SINGLE_FILE + +#endif /* GLH_GENEXT_H */ +#ifndef _WIN32 +#ifdef _WIN32 +#ifdef GL_VERSION_1_2 + /* These routines are prefixed by the preprocessor constant + GLH_CORE_1_2_PREFIX to avoid colliding with the OpenGL 1.2 namespace. */ +#define glBlendColor GLH_CORE_1_2_NAME(glBlendColor) +#define glBlendEquation GLH_CORE_1_2_NAME(glBlendEquation) +#define glDrawRangeElements GLH_CORE_1_2_NAME(glDrawRangeElements) +#define glColorTable GLH_CORE_1_2_NAME(glColorTable) +#define glColorTableParameterfv GLH_CORE_1_2_NAME(glColorTableParameterfv) +#define glColorTableParameteriv GLH_CORE_1_2_NAME(glColorTableParameteriv) +#define glCopyColorTable GLH_CORE_1_2_NAME(glCopyColorTable) +#define glGetColorTable GLH_CORE_1_2_NAME(glGetColorTable) +#define glGetColorTableParameterfv GLH_CORE_1_2_NAME(glGetColorTableParameterfv) +#define glGetColorTableParameteriv GLH_CORE_1_2_NAME(glGetColorTableParameteriv) +#define glColorSubTable GLH_CORE_1_2_NAME(glColorSubTable) +#define glCopyColorSubTable GLH_CORE_1_2_NAME(glCopyColorSubTable) +#define glConvolutionFilter1D GLH_CORE_1_2_NAME(glConvolutionFilter1D) +#define glConvolutionFilter2D GLH_CORE_1_2_NAME(glConvolutionFilter2D) +#define glConvolutionParameterf GLH_CORE_1_2_NAME(glConvolutionParameterf) +#define glConvolutionParameterfv GLH_CORE_1_2_NAME(glConvolutionParameterfv) +#define glConvolutionParameteri GLH_CORE_1_2_NAME(glConvolutionParameteri) +#define glConvolutionParameteriv GLH_CORE_1_2_NAME(glConvolutionParameteriv) +#define glCopyConvolutionFilter1D GLH_CORE_1_2_NAME(glCopyConvolutionFilter1D) +#define glCopyConvolutionFilter2D GLH_CORE_1_2_NAME(glCopyConvolutionFilter2D) +#define glGetConvolutionFilter GLH_CORE_1_2_NAME(glGetConvolutionFilter) +#define glGetConvolutionParameterfv GLH_CORE_1_2_NAME(glGetConvolutionParameterfv) +#define glGetConvolutionParameteriv GLH_CORE_1_2_NAME(glGetConvolutionParameteriv) +#define glGetSeparableFilter GLH_CORE_1_2_NAME(glGetSeparableFilter) +#define glSeparableFilter2D GLH_CORE_1_2_NAME(glSeparableFilter2D) +#define glGetHistogram GLH_CORE_1_2_NAME(glGetHistogram) +#define glGetHistogramParameterfv GLH_CORE_1_2_NAME(glGetHistogramParameterfv) +#define glGetHistogramParameteriv GLH_CORE_1_2_NAME(glGetHistogramParameteriv) +#define glGetMinmax GLH_CORE_1_2_NAME(glGetMinmax) +#define glGetMinmaxParameterfv GLH_CORE_1_2_NAME(glGetMinmaxParameterfv) +#define glGetMinmaxParameteriv GLH_CORE_1_2_NAME(glGetMinmaxParameteriv) +#define glHistogram GLH_CORE_1_2_NAME(glHistogram) +#define glMinmax GLH_CORE_1_2_NAME(glMinmax) +#define glResetHistogram GLH_CORE_1_2_NAME(glResetHistogram) +#define glResetMinmax GLH_CORE_1_2_NAME(glResetMinmax) +#define glTexImage3D GLH_CORE_1_2_NAME(glTexImage3D) +#define glTexSubImage3D GLH_CORE_1_2_NAME(glTexSubImage3D) +#define glCopyTexSubImage3D GLH_CORE_1_2_NAME(glCopyTexSubImage3D) +#define glMultiTexCoord1d GLH_CORE_1_2_NAME(glMultiTexCoord1d) +#define glMultiTexCoord1dv GLH_CORE_1_2_NAME(glMultiTexCoord1dv) +#define glMultiTexCoord1f GLH_CORE_1_2_NAME(glMultiTexCoord1f) +#define glMultiTexCoord1fv GLH_CORE_1_2_NAME(glMultiTexCoord1fv) +#define glMultiTexCoord1i GLH_CORE_1_2_NAME(glMultiTexCoord1i) +#define glMultiTexCoord1iv GLH_CORE_1_2_NAME(glMultiTexCoord1iv) +#define glMultiTexCoord1s GLH_CORE_1_2_NAME(glMultiTexCoord1s) +#define glMultiTexCoord1sv GLH_CORE_1_2_NAME(glMultiTexCoord1sv) +#define glMultiTexCoord2d GLH_CORE_1_2_NAME(glMultiTexCoord2d) +#define glMultiTexCoord2dv GLH_CORE_1_2_NAME(glMultiTexCoord2dv) +#define glMultiTexCoord2f GLH_CORE_1_2_NAME(glMultiTexCoord2f) +#define glMultiTexCoord2fv GLH_CORE_1_2_NAME(glMultiTexCoord2fv) +#define glMultiTexCoord2i GLH_CORE_1_2_NAME(glMultiTexCoord2i) +#define glMultiTexCoord2iv GLH_CORE_1_2_NAME(glMultiTexCoord2iv) +#define glMultiTexCoord2s GLH_CORE_1_2_NAME(glMultiTexCoord2s) +#define glMultiTexCoord2sv GLH_CORE_1_2_NAME(glMultiTexCoord2sv) +#define glMultiTexCoord3d GLH_CORE_1_2_NAME(glMultiTexCoord3d) +#define glMultiTexCoord3dv GLH_CORE_1_2_NAME(glMultiTexCoord3dv) +#define glMultiTexCoord3f GLH_CORE_1_2_NAME(glMultiTexCoord3f) +#define glMultiTexCoord3fv GLH_CORE_1_2_NAME(glMultiTexCoord3fv) +#define glMultiTexCoord3i GLH_CORE_1_2_NAME(glMultiTexCoord3i) +#define glMultiTexCoord3iv GLH_CORE_1_2_NAME(glMultiTexCoord3iv) +#define glMultiTexCoord3s GLH_CORE_1_2_NAME(glMultiTexCoord3s) +#define glMultiTexCoord3sv GLH_CORE_1_2_NAME(glMultiTexCoord3sv) +#define glMultiTexCoord4d GLH_CORE_1_2_NAME(glMultiTexCoord4d) +#define glMultiTexCoord4dv GLH_CORE_1_2_NAME(glMultiTexCoord4dv) +#define glMultiTexCoord4f GLH_CORE_1_2_NAME(glMultiTexCoord4f) +#define glMultiTexCoord4fv GLH_CORE_1_2_NAME(glMultiTexCoord4fv) +#define glMultiTexCoord4i GLH_CORE_1_2_NAME(glMultiTexCoord4i) +#define glMultiTexCoord4iv GLH_CORE_1_2_NAME(glMultiTexCoord4iv) +#define glMultiTexCoord4s GLH_CORE_1_2_NAME(glMultiTexCoord4s) +#define glMultiTexCoord4sv GLH_CORE_1_2_NAME(glMultiTexCoord4sv) +#define glActiveTexture GLH_CORE_1_2_NAME(glActiveTexture) +#define glClientActiveTexture GLH_CORE_1_2_NAME(glClientActiveTexture) +#endif +#endif + +#ifdef GL_VERSION_1_3 +#define glCompressedTexImage3D GLH_EXT_NAME(glCompressedTexImage3D) +#define glCompressedTexImage2D GLH_EXT_NAME(glCompressedTexImage2D) +#define glCompressedTexImage1D GLH_EXT_NAME(glCompressedTexImage1D) +#define glCompressedTexSubImage3D GLH_EXT_NAME(glCompressedTexSubImage3D) +#define glCompressedTexSubImage2D GLH_EXT_NAME(glCompressedTexSubImage2D) +#define glCompressedTexSubImage1D GLH_EXT_NAME(glCompressedTexSubImage1D) +#define glGetCompressedTexImage GLH_EXT_NAME(glGetCompressedTexImage) +#define glSampleCoverage GLH_EXT_NAME(glSampleCoverage) +#define glLoadTransposeMatrixf GLH_EXT_NAME(glLoadTransposeMatrixf) +#define glLoadTransposeMatrixd GLH_EXT_NAME(glLoadTransposeMatrixd) +#define glMultTransposeMatrixf GLH_EXT_NAME(glMultTransposeMatrixf) +#define glMultTransposeMatrixd GLH_EXT_NAME(glMultTransposeMatrixd) +#endif + +#ifdef GL_VERSION_1_4 +#define glMultiDrawArrays GLH_EXT_NAME(glMultiDrawArrays) +#define glMultiDrawElements GLH_EXT_NAME(glMultiDrawElements) +#define glPointParameterf GLH_EXT_NAME(glPointParameterf) +#define glPointParameterfv GLH_EXT_NAME(glPointParameterfv) +#define glSecondaryColor3b GLH_EXT_NAME(glSecondaryColor3b) +#define glSecondaryColor3bv GLH_EXT_NAME(glSecondaryColor3bv) +#define glSecondaryColor3d GLH_EXT_NAME(glSecondaryColor3d) +#define glSecondaryColor3dv GLH_EXT_NAME(glSecondaryColor3dv) +#define glSecondaryColor3f GLH_EXT_NAME(glSecondaryColor3f) +#define glSecondaryColor3fv GLH_EXT_NAME(glSecondaryColor3fv) +#define glSecondaryColor3i GLH_EXT_NAME(glSecondaryColor3i) +#define glSecondaryColor3iv GLH_EXT_NAME(glSecondaryColor3iv) +#define glSecondaryColor3s GLH_EXT_NAME(glSecondaryColor3s) +#define glSecondaryColor3sv GLH_EXT_NAME(glSecondaryColor3sv) +#define glSecondaryColor3ub GLH_EXT_NAME(glSecondaryColor3ub) +#define glSecondaryColor3ubv GLH_EXT_NAME(glSecondaryColor3ubv) +#define glSecondaryColor3ui GLH_EXT_NAME(glSecondaryColor3ui) +#define glSecondaryColor3uiv GLH_EXT_NAME(glSecondaryColor3uiv) +#define glSecondaryColor3us GLH_EXT_NAME(glSecondaryColor3us) +#define glSecondaryColor3usv GLH_EXT_NAME(glSecondaryColor3usv) +#define glSecondaryColorPointer GLH_EXT_NAME(glSecondaryColorPointer) +#define glBlendFuncSeparate GLH_EXT_NAME(glBlendFuncSeparate) +#define glWindowPos2d GLH_EXT_NAME(glWindowPos2d) +#define glWindowPos2f GLH_EXT_NAME(glWindowPos2f) +#define glWindowPos2i GLH_EXT_NAME(glWindowPos2i) +#define glWindowPos2s GLH_EXT_NAME(glWindowPos2s) +#define glWindowPos2dv GLH_EXT_NAME(glWindowPos2dv) +#define glWindowPos2fv GLH_EXT_NAME(glWindowPos2fv) +#define glWindowPos2iv GLH_EXT_NAME(glWindowPos2iv) +#define glWindowPos2sv GLH_EXT_NAME(glWindowPos2sv) +#define glWindowPos3d GLH_EXT_NAME(glWindowPos3d) +#define glWindowPos3f GLH_EXT_NAME(glWindowPos3f) +#define glWindowPos3i GLH_EXT_NAME(glWindowPos3i) +#define glWindowPos3s GLH_EXT_NAME(glWindowPos3s) +#define glWindowPos3dv GLH_EXT_NAME(glWindowPos3dv) +#define glWindowPos3fv GLH_EXT_NAME(glWindowPos3fv) +#define glWindowPos3iv GLH_EXT_NAME(glWindowPos3iv) +#define glWindowPos3sv GLH_EXT_NAME(glWindowPos3sv) +#endif + +#ifdef GL_ARB_depth_texture +#endif + +#ifdef GL_ARB_fragment_program +#endif + +#ifdef GL_ARB_multisample +#endif + +#ifdef _WIN32 +#ifdef GL_ARB_multitexture +#define glMultiTexCoord1dARB GLH_EXT_NAME(glMultiTexCoord1dARB) +#define glMultiTexCoord1dvARB GLH_EXT_NAME(glMultiTexCoord1dvARB) +#define glMultiTexCoord1fARB GLH_EXT_NAME(glMultiTexCoord1fARB) +#define glMultiTexCoord1fvARB GLH_EXT_NAME(glMultiTexCoord1fvARB) +#define glMultiTexCoord1iARB GLH_EXT_NAME(glMultiTexCoord1iARB) +#define glMultiTexCoord1ivARB GLH_EXT_NAME(glMultiTexCoord1ivARB) +#define glMultiTexCoord1sARB GLH_EXT_NAME(glMultiTexCoord1sARB) +#define glMultiTexCoord1svARB GLH_EXT_NAME(glMultiTexCoord1svARB) +#define glMultiTexCoord2dARB GLH_EXT_NAME(glMultiTexCoord2dARB) +#define glMultiTexCoord2dvARB GLH_EXT_NAME(glMultiTexCoord2dvARB) +#define glMultiTexCoord2fARB GLH_EXT_NAME(glMultiTexCoord2fARB) +#define glMultiTexCoord2fvARB GLH_EXT_NAME(glMultiTexCoord2fvARB) +#define glMultiTexCoord2iARB GLH_EXT_NAME(glMultiTexCoord2iARB) +#define glMultiTexCoord2ivARB GLH_EXT_NAME(glMultiTexCoord2ivARB) +#define glMultiTexCoord2sARB GLH_EXT_NAME(glMultiTexCoord2sARB) +#define glMultiTexCoord2svARB GLH_EXT_NAME(glMultiTexCoord2svARB) +#define glMultiTexCoord3dARB GLH_EXT_NAME(glMultiTexCoord3dARB) +#define glMultiTexCoord3dvARB GLH_EXT_NAME(glMultiTexCoord3dvARB) +#define glMultiTexCoord3fARB GLH_EXT_NAME(glMultiTexCoord3fARB) +#define glMultiTexCoord3fvARB GLH_EXT_NAME(glMultiTexCoord3fvARB) +#define glMultiTexCoord3iARB GLH_EXT_NAME(glMultiTexCoord3iARB) +#define glMultiTexCoord3ivARB GLH_EXT_NAME(glMultiTexCoord3ivARB) +#define glMultiTexCoord3sARB GLH_EXT_NAME(glMultiTexCoord3sARB) +#define glMultiTexCoord3svARB GLH_EXT_NAME(glMultiTexCoord3svARB) +#define glMultiTexCoord4dARB GLH_EXT_NAME(glMultiTexCoord4dARB) +#define glMultiTexCoord4dvARB GLH_EXT_NAME(glMultiTexCoord4dvARB) +#define glMultiTexCoord4fARB GLH_EXT_NAME(glMultiTexCoord4fARB) +#define glMultiTexCoord4fvARB GLH_EXT_NAME(glMultiTexCoord4fvARB) +#define glMultiTexCoord4iARB GLH_EXT_NAME(glMultiTexCoord4iARB) +#define glMultiTexCoord4ivARB GLH_EXT_NAME(glMultiTexCoord4ivARB) +#define glMultiTexCoord4sARB GLH_EXT_NAME(glMultiTexCoord4sARB) +#define glMultiTexCoord4svARB GLH_EXT_NAME(glMultiTexCoord4svARB) +#define glActiveTextureARB GLH_EXT_NAME(glActiveTextureARB) +#define glClientActiveTextureARB GLH_EXT_NAME(glClientActiveTextureARB) +#endif +#endif + +#ifdef GL_ARB_point_parameters +#define glPointParameterfARB GLH_EXT_NAME(glPointParameterfARB) +#define glPointParameterfvARB GLH_EXT_NAME(glPointParameterfvARB) +#endif + +#ifdef GL_ARB_shadow +#endif + +#ifdef GL_ARB_texture_border_clamp +#endif + +#ifdef GL_ARB_texture_compression +#define glCompressedTexImage3DARB GLH_EXT_NAME(glCompressedTexImage3DARB) +#define glCompressedTexImage2DARB GLH_EXT_NAME(glCompressedTexImage2DARB) +#define glCompressedTexImage1DARB GLH_EXT_NAME(glCompressedTexImage1DARB) +#define glCompressedTexSubImage3DARB GLH_EXT_NAME(glCompressedTexSubImage3DARB) +#define glCompressedTexSubImage2DARB GLH_EXT_NAME(glCompressedTexSubImage2DARB) +#define glCompressedTexSubImage1DARB GLH_EXT_NAME(glCompressedTexSubImage1DARB) +#define glGetCompressedTexImageARB GLH_EXT_NAME(glGetCompressedTexImageARB) +#endif + +#ifdef GL_ARB_texture_cube_map +#endif + +#ifdef GL_ARB_texture_env_add +#endif + +#ifdef GL_ARB_texture_env_combine +#endif + +#ifdef GL_ARB_texture_env_dot3 +#endif + +#ifdef GL_ARB_texture_mirrored_repeat +#endif + +#ifdef GL_ARB_transpose_matrix +#define glLoadTransposeMatrixfARB GLH_EXT_NAME(glLoadTransposeMatrixfARB) +#define glLoadTransposeMatrixdARB GLH_EXT_NAME(glLoadTransposeMatrixdARB) +#define glMultTransposeMatrixfARB GLH_EXT_NAME(glMultTransposeMatrixfARB) +#define glMultTransposeMatrixdARB GLH_EXT_NAME(glMultTransposeMatrixdARB) +#endif + +#ifdef GL_ARB_vertex_program +#define glVertexAttrib1sARB GLH_EXT_NAME(glVertexAttrib1sARB) +#define glVertexAttrib1fARB GLH_EXT_NAME(glVertexAttrib1fARB) +#define glVertexAttrib1dARB GLH_EXT_NAME(glVertexAttrib1dARB) +#define glVertexAttrib2sARB GLH_EXT_NAME(glVertexAttrib2sARB) +#define glVertexAttrib2fARB GLH_EXT_NAME(glVertexAttrib2fARB) +#define glVertexAttrib2dARB GLH_EXT_NAME(glVertexAttrib2dARB) +#define glVertexAttrib3sARB GLH_EXT_NAME(glVertexAttrib3sARB) +#define glVertexAttrib3fARB GLH_EXT_NAME(glVertexAttrib3fARB) +#define glVertexAttrib3dARB GLH_EXT_NAME(glVertexAttrib3dARB) +#define glVertexAttrib4sARB GLH_EXT_NAME(glVertexAttrib4sARB) +#define glVertexAttrib4fARB GLH_EXT_NAME(glVertexAttrib4fARB) +#define glVertexAttrib4dARB GLH_EXT_NAME(glVertexAttrib4dARB) +#define glVertexAttrib4NubARB GLH_EXT_NAME(glVertexAttrib4NubARB) +#define glVertexAttrib1svARB GLH_EXT_NAME(glVertexAttrib1svARB) +#define glVertexAttrib1fvARB GLH_EXT_NAME(glVertexAttrib1fvARB) +#define glVertexAttrib1dvARB GLH_EXT_NAME(glVertexAttrib1dvARB) +#define glVertexAttrib2svARB GLH_EXT_NAME(glVertexAttrib2svARB) +#define glVertexAttrib2fvARB GLH_EXT_NAME(glVertexAttrib2fvARB) +#define glVertexAttrib2dvARB GLH_EXT_NAME(glVertexAttrib2dvARB) +#define glVertexAttrib3svARB GLH_EXT_NAME(glVertexAttrib3svARB) +#define glVertexAttrib3fvARB GLH_EXT_NAME(glVertexAttrib3fvARB) +#define glVertexAttrib3dvARB GLH_EXT_NAME(glVertexAttrib3dvARB) +#define glVertexAttrib4bvARB GLH_EXT_NAME(glVertexAttrib4bvARB) +#define glVertexAttrib4svARB GLH_EXT_NAME(glVertexAttrib4svARB) +#define glVertexAttrib4ivARB GLH_EXT_NAME(glVertexAttrib4ivARB) +#define glVertexAttrib4ubvARB GLH_EXT_NAME(glVertexAttrib4ubvARB) +#define glVertexAttrib4usvARB GLH_EXT_NAME(glVertexAttrib4usvARB) +#define glVertexAttrib4uivARB GLH_EXT_NAME(glVertexAttrib4uivARB) +#define glVertexAttrib4fvARB GLH_EXT_NAME(glVertexAttrib4fvARB) +#define glVertexAttrib4dvARB GLH_EXT_NAME(glVertexAttrib4dvARB) +#define glVertexAttrib4NbvARB GLH_EXT_NAME(glVertexAttrib4NbvARB) +#define glVertexAttrib4NsvARB GLH_EXT_NAME(glVertexAttrib4NsvARB) +#define glVertexAttrib4NivARB GLH_EXT_NAME(glVertexAttrib4NivARB) +#define glVertexAttrib4NubvARB GLH_EXT_NAME(glVertexAttrib4NubvARB) +#define glVertexAttrib4NusvARB GLH_EXT_NAME(glVertexAttrib4NusvARB) +#define glVertexAttrib4NuivARB GLH_EXT_NAME(glVertexAttrib4NuivARB) +#define glVertexAttribPointerARB GLH_EXT_NAME(glVertexAttribPointerARB) +#define glEnableVertexAttribArrayARB GLH_EXT_NAME(glEnableVertexAttribArrayARB) +#define glDisableVertexAttribArrayARB GLH_EXT_NAME(glDisableVertexAttribArrayARB) +#define glProgramStringARB GLH_EXT_NAME(glProgramStringARB) +#define glBindProgramARB GLH_EXT_NAME(glBindProgramARB) +#define glDeleteProgramsARB GLH_EXT_NAME(glDeleteProgramsARB) +#define glGenProgramsARB GLH_EXT_NAME(glGenProgramsARB) +#define glProgramEnvParameter4dARB GLH_EXT_NAME(glProgramEnvParameter4dARB) +#define glProgramEnvParameter4dvARB GLH_EXT_NAME(glProgramEnvParameter4dvARB) +#define glProgramEnvParameter4fARB GLH_EXT_NAME(glProgramEnvParameter4fARB) +#define glProgramEnvParameter4fvARB GLH_EXT_NAME(glProgramEnvParameter4fvARB) +#define glProgramLocalParameter4dARB GLH_EXT_NAME(glProgramLocalParameter4dARB) +#define glProgramLocalParameter4dvARB GLH_EXT_NAME(glProgramLocalParameter4dvARB) +#define glProgramLocalParameter4fARB GLH_EXT_NAME(glProgramLocalParameter4fARB) +#define glProgramLocalParameter4fvARB GLH_EXT_NAME(glProgramLocalParameter4fvARB) +#define glGetProgramEnvParameterdvARB GLH_EXT_NAME(glGetProgramEnvParameterdvARB) +#define glGetProgramEnvParameterfvARB GLH_EXT_NAME(glGetProgramEnvParameterfvARB) +#define glGetProgramLocalParameterdvARB GLH_EXT_NAME(glGetProgramLocalParameterdvARB) +#define glGetProgramLocalParameterfvARB GLH_EXT_NAME(glGetProgramLocalParameterfvARB) +#define glGetProgramivARB GLH_EXT_NAME(glGetProgramivARB) +#define glGetProgramStringARB GLH_EXT_NAME(glGetProgramStringARB) +#define glGetVertexAttribdvARB GLH_EXT_NAME(glGetVertexAttribdvARB) +#define glGetVertexAttribfvARB GLH_EXT_NAME(glGetVertexAttribfvARB) +#define glGetVertexAttribivARB GLH_EXT_NAME(glGetVertexAttribivARB) +#define glGetVertexAttribPointervARB GLH_EXT_NAME(glGetVertexAttribPointervARB) +#define glIsProgramARB GLH_EXT_NAME(glIsProgramARB) +#endif + +#ifdef GL_ARB_window_pos +#define glWindowPos2dARB GLH_EXT_NAME(glWindowPos2dARB) +#define glWindowPos2fARB GLH_EXT_NAME(glWindowPos2fARB) +#define glWindowPos2iARB GLH_EXT_NAME(glWindowPos2iARB) +#define glWindowPos2sARB GLH_EXT_NAME(glWindowPos2sARB) +#define glWindowPos2dvARB GLH_EXT_NAME(glWindowPos2dvARB) +#define glWindowPos2fvARB GLH_EXT_NAME(glWindowPos2fvARB) +#define glWindowPos2ivARB GLH_EXT_NAME(glWindowPos2ivARB) +#define glWindowPos2svARB GLH_EXT_NAME(glWindowPos2svARB) +#define glWindowPos3dARB GLH_EXT_NAME(glWindowPos3dARB) +#define glWindowPos3fARB GLH_EXT_NAME(glWindowPos3fARB) +#define glWindowPos3iARB GLH_EXT_NAME(glWindowPos3iARB) +#define glWindowPos3sARB GLH_EXT_NAME(glWindowPos3sARB) +#define glWindowPos3dvARB GLH_EXT_NAME(glWindowPos3dvARB) +#define glWindowPos3fvARB GLH_EXT_NAME(glWindowPos3fvARB) +#define glWindowPos3ivARB GLH_EXT_NAME(glWindowPos3ivARB) +#define glWindowPos3svARB GLH_EXT_NAME(glWindowPos3svARB) +#endif + +#ifdef GL_EXT_abgr +#endif + +#ifdef GL_EXT_bgra +#endif + +#ifdef GL_EXT_blend_color +#define glBlendColorEXT GLH_EXT_NAME(glBlendColorEXT) +#endif + +#ifdef GL_EXT_blend_func_separate +#define glBlendFuncSeparateEXT GLH_EXT_NAME(glBlendFuncSeparateEXT) +#endif + +#ifdef GL_EXT_blend_minmax +#define glBlendEquationEXT GLH_EXT_NAME(glBlendEquationEXT) +#endif + +#ifdef GL_EXT_blend_subtract +#endif + +#ifdef GL_EXT_compiled_vertex_array +#define glLockArraysEXT GLH_EXT_NAME(glLockArraysEXT) +#define glUnlockArraysEXT GLH_EXT_NAME(glUnlockArraysEXT) +#endif + +#ifdef GL_EXT_draw_range_elements +#endif + +#ifdef GL_EXT_fog_coord +#define glFogCoorddEXT GLH_EXT_NAME(glFogCoorddEXT) +#define glFogCoorddvEXT GLH_EXT_NAME(glFogCoorddvEXT) +#define glFogCoordfEXT GLH_EXT_NAME(glFogCoordfEXT) +#define glFogCoordfvEXT GLH_EXT_NAME(glFogCoordfvEXT) +#define glFogCoordPointerEXT GLH_EXT_NAME(glFogCoordPointerEXT) +#endif + +#ifdef GL_EXT_multi_draw_arrays +#define glMultiDrawArraysEXT GLH_EXT_NAME(glMultiDrawArraysEXT) +#define glMultiDrawElementsEXT GLH_EXT_NAME(glMultiDrawElementsEXT) +#endif + +#ifdef GL_EXT_light_max_exponent +#endif + +#ifdef GL_EXT_packed_pixels +#endif + +#ifdef GL_EXT_paletted_texture +#define glColorSubTableEXT GLH_EXT_NAME(glColorSubTableEXT) +#define glColorTableEXT GLH_EXT_NAME(glColorTableEXT) +#define glGetColorTableEXT GLH_EXT_NAME(glGetColorTableEXT) +#define glGetColorTableParameterfvEXT GLH_EXT_NAME(glGetColorTableParameterfvEXT) +#define glGetColorTableParameterivEXT GLH_EXT_NAME(glGetColorTableParameterivEXT) +#endif + +#ifdef GL_EXT_point_parameters +#define glPointParameterfEXT GLH_EXT_NAME(glPointParameterfEXT) +#define glPointParameterfvEXT GLH_EXT_NAME(glPointParameterfvEXT) +#endif + +#ifdef GL_EXT_rescale_normal +#endif + +#ifdef GL_EXT_secondary_color +#define glSecondaryColor3bEXT GLH_EXT_NAME(glSecondaryColor3bEXT) +#define glSecondaryColor3bvEXT GLH_EXT_NAME(glSecondaryColor3bvEXT) +#define glSecondaryColor3dEXT GLH_EXT_NAME(glSecondaryColor3dEXT) +#define glSecondaryColor3dvEXT GLH_EXT_NAME(glSecondaryColor3dvEXT) +#define glSecondaryColor3fEXT GLH_EXT_NAME(glSecondaryColor3fEXT) +#define glSecondaryColor3fvEXT GLH_EXT_NAME(glSecondaryColor3fvEXT) +#define glSecondaryColor3iEXT GLH_EXT_NAME(glSecondaryColor3iEXT) +#define glSecondaryColor3ivEXT GLH_EXT_NAME(glSecondaryColor3ivEXT) +#define glSecondaryColor3sEXT GLH_EXT_NAME(glSecondaryColor3sEXT) +#define glSecondaryColor3svEXT GLH_EXT_NAME(glSecondaryColor3svEXT) +#define glSecondaryColor3ubEXT GLH_EXT_NAME(glSecondaryColor3ubEXT) +#define glSecondaryColor3ubvEXT GLH_EXT_NAME(glSecondaryColor3ubvEXT) +#define glSecondaryColor3uiEXT GLH_EXT_NAME(glSecondaryColor3uiEXT) +#define glSecondaryColor3uivEXT GLH_EXT_NAME(glSecondaryColor3uivEXT) +#define glSecondaryColor3usEXT GLH_EXT_NAME(glSecondaryColor3usEXT) +#define glSecondaryColor3usvEXT GLH_EXT_NAME(glSecondaryColor3usvEXT) +#define glSecondaryColorPointerEXT GLH_EXT_NAME(glSecondaryColorPointerEXT) +#endif + +#ifdef GL_EXT_separate_specular_color +#endif + +#ifdef GL_EXT_shadow_funcs +#endif + +#ifdef GL_EXT_shared_texture_palette +#endif + +#ifdef GL_EXT_stencil_two_side +#define glActiveStencilFaceEXT GLH_EXT_NAME(glActiveStencilFaceEXT) +#endif + +#ifdef GL_EXT_stencil_wrap +#endif + +#ifdef GL_EXT_texture_compression_s3tc +#endif + +#ifdef GL_EXT_texture_cube_map +#endif + +#ifdef GL_EXT_texture_edge_clamp +#endif + +#ifdef GL_EXT_texture_env_add +#endif + +#ifdef GL_EXT_texture_env_combine +#endif + +#ifdef GL_EXT_texture_env_dot3 +#endif + +#ifdef GL_EXT_texture_filter_anisotropic +#endif + +#ifdef GL_EXT_texture_lod_bias +#endif + +#ifdef GL_EXT_texture_object +#define glAreTexturesResidentEXT GLH_EXT_NAME(glAreTexturesResidentEXT) +#define glBindTextureEXT GLH_EXT_NAME(glBindTextureEXT) +#define glDeleteTexturesEXT GLH_EXT_NAME(glDeleteTexturesEXT) +#define glGenTexturesEXT GLH_EXT_NAME(glGenTexturesEXT) +#define glIsTextureEXT GLH_EXT_NAME(glIsTextureEXT) +#define glPrioritizeTexturesEXT GLH_EXT_NAME(glPrioritizeTexturesEXT) +#endif + +#ifdef GL_EXT_texture_rectangle +#endif + +#ifdef GL_EXT_texture3D +#define glTexImage3DEXT GLH_EXT_NAME(glTexImage3DEXT) +#endif + +#ifdef GL_EXT_vertex_array +#define glArrayElementEXT GLH_EXT_NAME(glArrayElementEXT) +#define glColorPointerEXT GLH_EXT_NAME(glColorPointerEXT) +#define glEdgeFlagPointerEXT GLH_EXT_NAME(glEdgeFlagPointerEXT) +#define glGetPointervEXT GLH_EXT_NAME(glGetPointervEXT) +#define glIndexPointerEXT GLH_EXT_NAME(glIndexPointerEXT) +#define glNormalPointerEXT GLH_EXT_NAME(glNormalPointerEXT) +#define glTexCoordPointerEXT GLH_EXT_NAME(glTexCoordPointerEXT) +#define glVertexPointerEXT GLH_EXT_NAME(glVertexPointerEXT) +#define glDrawArraysEXT GLH_EXT_NAME(glDrawArraysEXT) +#endif + +#ifdef GL_EXT_vertex_weighting +#define glVertexWeightfEXT GLH_EXT_NAME(glVertexWeightfEXT) +#define glVertexWeightfvEXT GLH_EXT_NAME(glVertexWeightfvEXT) +#define glVertexWeightPointerEXT GLH_EXT_NAME(glVertexWeightPointerEXT) +#endif + +#ifdef GL_HP_occlusion_test +#endif + +#ifdef GL_IBM_texture_mirrored_repeat +#endif + +#ifdef GL_NV_blend_square +#endif + +#ifdef GL_NV_copy_depth_to_color +#endif + +#ifdef GL_NV_depth_clamp +#endif + +#ifdef GL_NV_element_array +#define glElementPointerNV GLH_EXT_NAME(glElementPointerNV) +#define glDrawElementArrayNV GLH_EXT_NAME(glDrawElementArrayNV) +#define glDrawRangeElementArrayNV GLH_EXT_NAME(glDrawRangeElementArrayNV) +#define glMultiDrawElementArrayNV GLH_EXT_NAME(glMultiDrawElementArrayNV) +#define glMultiDrawRangeElementArrayNV GLH_EXT_NAME(glMultiDrawRangeElementArrayNV) +#endif + +#ifdef GL_NV_fence +#define glGenFencesNV GLH_EXT_NAME(glGenFencesNV) +#define glDeleteFencesNV GLH_EXT_NAME(glDeleteFencesNV) +#define glSetFenceNV GLH_EXT_NAME(glSetFenceNV) +#define glTestFenceNV GLH_EXT_NAME(glTestFenceNV) +#define glFinishFenceNV GLH_EXT_NAME(glFinishFenceNV) +#define glIsFenceNV GLH_EXT_NAME(glIsFenceNV) +#define glGetFenceivNV GLH_EXT_NAME(glGetFenceivNV) +#endif + +#ifdef GL_NV_float_buffer +#endif + +#ifdef GL_NV_fog_distance +#endif + +#ifdef GL_NV_fragment_program +#define glProgramNamedParameter4fNV GLH_EXT_NAME(glProgramNamedParameter4fNV) +#define glProgramNamedParameter4dNV GLH_EXT_NAME(glProgramNamedParameter4dNV) +#define glProgramNamedParameter4fvNV GLH_EXT_NAME(glProgramNamedParameter4fvNV) +#define glProgramNamedParameter4dvNV GLH_EXT_NAME(glProgramNamedParameter4dvNV) +#define glGetProgramNamedParameterfvNV GLH_EXT_NAME(glGetProgramNamedParameterfvNV) +#define glGetProgramNamedParameterdvNV GLH_EXT_NAME(glGetProgramNamedParameterdvNV) +#endif + +#ifdef GL_NV_half_float +#define glVertex2hNV GLH_EXT_NAME(glVertex2hNV) +#define glVertex2hvNV GLH_EXT_NAME(glVertex2hvNV) +#define glVertex3hNV GLH_EXT_NAME(glVertex3hNV) +#define glVertex3hvNV GLH_EXT_NAME(glVertex3hvNV) +#define glVertex4hNV GLH_EXT_NAME(glVertex4hNV) +#define glVertex4hvNV GLH_EXT_NAME(glVertex4hvNV) +#define glNormal3hNV GLH_EXT_NAME(glNormal3hNV) +#define glNormal3hvNV GLH_EXT_NAME(glNormal3hvNV) +#define glColor3hNV GLH_EXT_NAME(glColor3hNV) +#define glColor3hvNV GLH_EXT_NAME(glColor3hvNV) +#define glColor4hNV GLH_EXT_NAME(glColor4hNV) +#define glColor4hvNV GLH_EXT_NAME(glColor4hvNV) +#define glTexCoord1hNV GLH_EXT_NAME(glTexCoord1hNV) +#define glTexCoord1hvNV GLH_EXT_NAME(glTexCoord1hvNV) +#define glTexCoord2hNV GLH_EXT_NAME(glTexCoord2hNV) +#define glTexCoord2hvNV GLH_EXT_NAME(glTexCoord2hvNV) +#define glTexCoord3hNV GLH_EXT_NAME(glTexCoord3hNV) +#define glTexCoord3hvNV GLH_EXT_NAME(glTexCoord3hvNV) +#define glTexCoord4hNV GLH_EXT_NAME(glTexCoord4hNV) +#define glTexCoord4hvNV GLH_EXT_NAME(glTexCoord4hvNV) +#define glMultiTexCoord1hNV GLH_EXT_NAME(glMultiTexCoord1hNV) +#define glMultiTexCoord1hvNV GLH_EXT_NAME(glMultiTexCoord1hvNV) +#define glMultiTexCoord2hNV GLH_EXT_NAME(glMultiTexCoord2hNV) +#define glMultiTexCoord2hvNV GLH_EXT_NAME(glMultiTexCoord2hvNV) +#define glMultiTexCoord3hNV GLH_EXT_NAME(glMultiTexCoord3hNV) +#define glMultiTexCoord3hvNV GLH_EXT_NAME(glMultiTexCoord3hvNV) +#define glMultiTexCoord4hNV GLH_EXT_NAME(glMultiTexCoord4hNV) +#define glMultiTexCoord4hvNV GLH_EXT_NAME(glMultiTexCoord4hvNV) +#define glFogCoordhNV GLH_EXT_NAME(glFogCoordhNV) +#define glFogCoordhvNV GLH_EXT_NAME(glFogCoordhvNV) +#define glSecondaryColor3hNV GLH_EXT_NAME(glSecondaryColor3hNV) +#define glSecondaryColor3hvNV GLH_EXT_NAME(glSecondaryColor3hvNV) +#define glVertexWeighthNV GLH_EXT_NAME(glVertexWeighthNV) +#define glVertexWeighthvNV GLH_EXT_NAME(glVertexWeighthvNV) +#define glVertexAttrib1hNV GLH_EXT_NAME(glVertexAttrib1hNV) +#define glVertexAttrib1hvNV GLH_EXT_NAME(glVertexAttrib1hvNV) +#define glVertexAttrib2hNV GLH_EXT_NAME(glVertexAttrib2hNV) +#define glVertexAttrib2hvNV GLH_EXT_NAME(glVertexAttrib2hvNV) +#define glVertexAttrib3hNV GLH_EXT_NAME(glVertexAttrib3hNV) +#define glVertexAttrib3hvNV GLH_EXT_NAME(glVertexAttrib3hvNV) +#define glVertexAttrib4hNV GLH_EXT_NAME(glVertexAttrib4hNV) +#define glVertexAttrib4hvNV GLH_EXT_NAME(glVertexAttrib4hvNV) +#define glVertexAttribs1hvNV GLH_EXT_NAME(glVertexAttribs1hvNV) +#define glVertexAttribs2hvNV GLH_EXT_NAME(glVertexAttribs2hvNV) +#define glVertexAttribs3hvNV GLH_EXT_NAME(glVertexAttribs3hvNV) +#define glVertexAttribs4hvNV GLH_EXT_NAME(glVertexAttribs4hvNV) +#endif + +#ifdef GL_NV_light_max_exponent +#endif + +#ifdef GL_NV_multisample_filter_hint +#endif + +#ifdef GL_NV_occlusion_query +#define glGenOcclusionQueriesNV GLH_EXT_NAME(glGenOcclusionQueriesNV) +#define glDeleteOcclusionQueriesNV GLH_EXT_NAME(glDeleteOcclusionQueriesNV) +#define glIsOcclusionQueryNV GLH_EXT_NAME(glIsOcclusionQueryNV) +#define glBeginOcclusionQueryNV GLH_EXT_NAME(glBeginOcclusionQueryNV) +#define glEndOcclusionQueryNV GLH_EXT_NAME(glEndOcclusionQueryNV) +#define glGetOcclusionQueryivNV GLH_EXT_NAME(glGetOcclusionQueryivNV) +#define glGetOcclusionQueryuivNV GLH_EXT_NAME(glGetOcclusionQueryuivNV) +#endif + +#ifdef GL_NV_packed_depth_stencil +#endif + +#ifdef GL_NV_pixel_data_range +#define glPixelDataRangeNV GLH_EXT_NAME(glPixelDataRangeNV) +#define glFlushPixelDataRangeNV GLH_EXT_NAME(glFlushPixelDataRangeNV) +#endif + +#ifdef GL_NV_point_sprite +#define glPointParameteriNV GLH_EXT_NAME(glPointParameteriNV) +#define glPointParameterivNV GLH_EXT_NAME(glPointParameterivNV) +#endif + +#ifdef GL_NV_primitive_restart +#define glPrimitiveRestartNV GLH_EXT_NAME(glPrimitiveRestartNV) +#define glPrimitiveRestartIndexNV GLH_EXT_NAME(glPrimitiveRestartIndexNV) +#endif + +#ifdef GL_NV_register_combiners +#define glCombinerParameterfvNV GLH_EXT_NAME(glCombinerParameterfvNV) +#define glCombinerParameterfNV GLH_EXT_NAME(glCombinerParameterfNV) +#define glCombinerParameterivNV GLH_EXT_NAME(glCombinerParameterivNV) +#define glCombinerParameteriNV GLH_EXT_NAME(glCombinerParameteriNV) +#define glCombinerInputNV GLH_EXT_NAME(glCombinerInputNV) +#define glCombinerOutputNV GLH_EXT_NAME(glCombinerOutputNV) +#define glFinalCombinerInputNV GLH_EXT_NAME(glFinalCombinerInputNV) +#define glGetCombinerInputParameterfvNV GLH_EXT_NAME(glGetCombinerInputParameterfvNV) +#define glGetCombinerInputParameterivNV GLH_EXT_NAME(glGetCombinerInputParameterivNV) +#define glGetCombinerOutputParameterfvNV GLH_EXT_NAME(glGetCombinerOutputParameterfvNV) +#define glGetCombinerOutputParameterivNV GLH_EXT_NAME(glGetCombinerOutputParameterivNV) +#define glGetFinalCombinerInputParameterfvNV GLH_EXT_NAME(glGetFinalCombinerInputParameterfvNV) +#define glGetFinalCombinerInputParameterivNV GLH_EXT_NAME(glGetFinalCombinerInputParameterivNV) +#endif + +#ifdef GL_NV_register_combiners2 +#define glCombinerStageParameterfvNV GLH_EXT_NAME(glCombinerStageParameterfvNV) +#define glGetCombinerStageParameterfvNV GLH_EXT_NAME(glGetCombinerStageParameterfvNV) +#endif + +#ifdef GL_NV_stencil_two_side +#define glActiveStencilFaceNV GLH_EXT_NAME(glActiveStencilFaceNV) +#endif + +#ifdef GL_NV_texgen_reflection +#endif + +#ifdef GL_NV_texture_compression_vtc +#endif + +#ifdef GL_NV_texture_env_combine4 +#endif + +#ifdef GL_NV_texture_rectangle +#endif + +#ifdef GL_NV_texture_shader +#endif + +#ifdef GL_NV_texture_shader2 +#endif + +#ifdef GL_NV_texture_shader3 +#endif + +#ifdef GL_NV_vertex_array_range +#define glFlushVertexArrayRangeNV GLH_EXT_NAME(glFlushVertexArrayRangeNV) +#define glVertexArrayRangeNV GLH_EXT_NAME(glVertexArrayRangeNV) +# ifdef _WIN32 +#define wglAllocateMemoryNV GLH_EXT_NAME(wglAllocateMemoryNV) +# endif +# ifdef GLX_VERSION_1_3 +#define glXAllocateMemoryNV GLH_EXT_NAME(glXAllocateMemoryNV) +# endif +# ifdef _WIN32 +#define wglFreeMemoryNV GLH_EXT_NAME(wglFreeMemoryNV) +# endif +# ifdef GLX_VERSION_1_3 +#define glXFreeMemoryNV GLH_EXT_NAME(glXFreeMemoryNV) +# endif +#endif + +#ifdef GL_NV_vertex_array_range2 +#endif + +#ifdef GL_NV_vertex_program +#define glAreProgramsResidentNV GLH_EXT_NAME(glAreProgramsResidentNV) +#define glBindProgramNV GLH_EXT_NAME(glBindProgramNV) +#define glDeleteProgramsNV GLH_EXT_NAME(glDeleteProgramsNV) +#define glExecuteProgramNV GLH_EXT_NAME(glExecuteProgramNV) +#define glGenProgramsNV GLH_EXT_NAME(glGenProgramsNV) +#define glGetProgramParameterdvNV GLH_EXT_NAME(glGetProgramParameterdvNV) +#define glGetProgramParameterfvNV GLH_EXT_NAME(glGetProgramParameterfvNV) +#define glGetProgramivNV GLH_EXT_NAME(glGetProgramivNV) +#define glGetProgramStringNV GLH_EXT_NAME(glGetProgramStringNV) +#define glGetTrackMatrixivNV GLH_EXT_NAME(glGetTrackMatrixivNV) +#define glGetVertexAttribdvNV GLH_EXT_NAME(glGetVertexAttribdvNV) +#define glGetVertexAttribfvNV GLH_EXT_NAME(glGetVertexAttribfvNV) +#define glGetVertexAttribivNV GLH_EXT_NAME(glGetVertexAttribivNV) +#define glGetVertexAttribPointervNV GLH_EXT_NAME(glGetVertexAttribPointervNV) +#define glIsProgramNV GLH_EXT_NAME(glIsProgramNV) +#define glLoadProgramNV GLH_EXT_NAME(glLoadProgramNV) +#define glProgramParameter4dNV GLH_EXT_NAME(glProgramParameter4dNV) +#define glProgramParameter4dvNV GLH_EXT_NAME(glProgramParameter4dvNV) +#define glProgramParameter4fNV GLH_EXT_NAME(glProgramParameter4fNV) +#define glProgramParameter4fvNV GLH_EXT_NAME(glProgramParameter4fvNV) +#define glProgramParameters4dvNV GLH_EXT_NAME(glProgramParameters4dvNV) +#define glProgramParameters4fvNV GLH_EXT_NAME(glProgramParameters4fvNV) +#define glRequestResidentProgramsNV GLH_EXT_NAME(glRequestResidentProgramsNV) +#define glTrackMatrixNV GLH_EXT_NAME(glTrackMatrixNV) +#define glVertexAttribPointerNV GLH_EXT_NAME(glVertexAttribPointerNV) +#define glVertexAttrib1dNV GLH_EXT_NAME(glVertexAttrib1dNV) +#define glVertexAttrib1dvNV GLH_EXT_NAME(glVertexAttrib1dvNV) +#define glVertexAttrib1fNV GLH_EXT_NAME(glVertexAttrib1fNV) +#define glVertexAttrib1fvNV GLH_EXT_NAME(glVertexAttrib1fvNV) +#define glVertexAttrib1sNV GLH_EXT_NAME(glVertexAttrib1sNV) +#define glVertexAttrib1svNV GLH_EXT_NAME(glVertexAttrib1svNV) +#define glVertexAttrib2dNV GLH_EXT_NAME(glVertexAttrib2dNV) +#define glVertexAttrib2dvNV GLH_EXT_NAME(glVertexAttrib2dvNV) +#define glVertexAttrib2fNV GLH_EXT_NAME(glVertexAttrib2fNV) +#define glVertexAttrib2fvNV GLH_EXT_NAME(glVertexAttrib2fvNV) +#define glVertexAttrib2sNV GLH_EXT_NAME(glVertexAttrib2sNV) +#define glVertexAttrib2svNV GLH_EXT_NAME(glVertexAttrib2svNV) +#define glVertexAttrib3dNV GLH_EXT_NAME(glVertexAttrib3dNV) +#define glVertexAttrib3dvNV GLH_EXT_NAME(glVertexAttrib3dvNV) +#define glVertexAttrib3fNV GLH_EXT_NAME(glVertexAttrib3fNV) +#define glVertexAttrib3fvNV GLH_EXT_NAME(glVertexAttrib3fvNV) +#define glVertexAttrib3sNV GLH_EXT_NAME(glVertexAttrib3sNV) +#define glVertexAttrib3svNV GLH_EXT_NAME(glVertexAttrib3svNV) +#define glVertexAttrib4dNV GLH_EXT_NAME(glVertexAttrib4dNV) +#define glVertexAttrib4dvNV GLH_EXT_NAME(glVertexAttrib4dvNV) +#define glVertexAttrib4fNV GLH_EXT_NAME(glVertexAttrib4fNV) +#define glVertexAttrib4fvNV GLH_EXT_NAME(glVertexAttrib4fvNV) +#define glVertexAttrib4sNV GLH_EXT_NAME(glVertexAttrib4sNV) +#define glVertexAttrib4svNV GLH_EXT_NAME(glVertexAttrib4svNV) +#define glVertexAttrib4ubvNV GLH_EXT_NAME(glVertexAttrib4ubvNV) +#define glVertexAttribs1dvNV GLH_EXT_NAME(glVertexAttribs1dvNV) +#define glVertexAttribs1fvNV GLH_EXT_NAME(glVertexAttribs1fvNV) +#define glVertexAttribs1svNV GLH_EXT_NAME(glVertexAttribs1svNV) +#define glVertexAttribs2dvNV GLH_EXT_NAME(glVertexAttribs2dvNV) +#define glVertexAttribs2fvNV GLH_EXT_NAME(glVertexAttribs2fvNV) +#define glVertexAttribs2svNV GLH_EXT_NAME(glVertexAttribs2svNV) +#define glVertexAttribs3dvNV GLH_EXT_NAME(glVertexAttribs3dvNV) +#define glVertexAttribs3fvNV GLH_EXT_NAME(glVertexAttribs3fvNV) +#define glVertexAttribs3svNV GLH_EXT_NAME(glVertexAttribs3svNV) +#define glVertexAttribs4dvNV GLH_EXT_NAME(glVertexAttribs4dvNV) +#define glVertexAttribs4fvNV GLH_EXT_NAME(glVertexAttribs4fvNV) +#define glVertexAttribs4svNV GLH_EXT_NAME(glVertexAttribs4svNV) +#define glVertexAttribs4ubvNV GLH_EXT_NAME(glVertexAttribs4ubvNV) +#endif + +#ifdef GL_NV_vertex_program1_1 +#endif + +#ifdef GL_NV_vertex_program2 +#endif + +#ifdef GL_SGIS_generate_mipmap +#endif + +#ifdef GL_SGIS_texture_lod +#endif + +#ifdef GL_SGIX_depth_texture +#endif + +#ifdef GL_SGIX_shadow +#endif + +#ifdef GL_WIN_swap_hint +#define glAddSwapHintRectWIN GLH_EXT_NAME(glAddSwapHintRectWIN) +#endif + +#ifdef WGL_ARB_buffer_region +# ifdef _WIN32 +#define wglCreateBufferRegionARB GLH_EXT_NAME(wglCreateBufferRegionARB) +# endif +# ifdef _WIN32 +#define wglDeleteBufferRegionARB GLH_EXT_NAME(wglDeleteBufferRegionARB) +# endif +# ifdef _WIN32 +#define wglSaveBufferRegionARB GLH_EXT_NAME(wglSaveBufferRegionARB) +# endif +# ifdef _WIN32 +#define wglRestoreBufferRegionARB GLH_EXT_NAME(wglRestoreBufferRegionARB) +# endif +#endif + +#ifdef WGL_ARB_extensions_string +# ifdef _WIN32 +#define wglGetExtensionsStringARB GLH_EXT_NAME(wglGetExtensionsStringARB) +# endif +#endif + +#ifdef WGL_ARB_pbuffer +# ifdef _WIN32 +#define wglCreatePbufferARB GLH_EXT_NAME(wglCreatePbufferARB) +# endif +# ifdef _WIN32 +#define wglGetPbufferDCARB GLH_EXT_NAME(wglGetPbufferDCARB) +# endif +# ifdef _WIN32 +#define wglReleasePbufferDCARB GLH_EXT_NAME(wglReleasePbufferDCARB) +# endif +# ifdef _WIN32 +#define wglDestroyPbufferARB GLH_EXT_NAME(wglDestroyPbufferARB) +# endif +# ifdef _WIN32 +#define wglQueryPbufferARB GLH_EXT_NAME(wglQueryPbufferARB) +# endif +#endif + +#ifdef WGL_ARB_pixel_format +# ifdef _WIN32 +#define wglGetPixelFormatAttribivARB GLH_EXT_NAME(wglGetPixelFormatAttribivARB) +# endif +# ifdef _WIN32 +#define wglGetPixelFormatAttribfvARB GLH_EXT_NAME(wglGetPixelFormatAttribfvARB) +# endif +# ifdef _WIN32 +#define wglChoosePixelFormatARB GLH_EXT_NAME(wglChoosePixelFormatARB) +# endif +#endif + +#ifdef WGL_ARB_render_texture +# ifdef _WIN32 +#define wglBindTexImageARB GLH_EXT_NAME(wglBindTexImageARB) +# endif +# ifdef _WIN32 +#define wglReleaseTexImageARB GLH_EXT_NAME(wglReleaseTexImageARB) +# endif +# ifdef _WIN32 +#define wglSetPbufferAttribARB GLH_EXT_NAME(wglSetPbufferAttribARB) +# endif +#endif + +#ifdef WGL_EXT_extensions_string +# ifdef _WIN32 +#define wglGetExtensionsStringEXT GLH_EXT_NAME(wglGetExtensionsStringEXT) +# endif +#endif + +#ifdef WGL_EXT_swap_control +# ifdef _WIN32 +#define wglSwapIntervalEXT GLH_EXT_NAME(wglSwapIntervalEXT) +# endif +# ifdef _WIN32 +#define wglGetSwapIntervalEXT GLH_EXT_NAME(wglGetSwapIntervalEXT) +# endif +#endif + +#ifdef WGL_NV_float_buffer +#endif + +#ifdef WGL_NV_render_depth_texture +#endif + +#ifdef WGL_NV_render_texture_rectangle +#endif + +#ifdef GLX_SGIX_pbuffer +# ifdef GLX_VERSION_1_3 +#define glXCreateGLXPbufferSGIX GLH_EXT_NAME(glXCreateGLXPbufferSGIX) +# endif +# ifdef GLX_VERSION_1_3 +#define glXDestroyGLXPbufferSGIX GLH_EXT_NAME(glXDestroyGLXPbufferSGIX) +# endif +# ifdef GLX_VERSION_1_3 +#define glXQueryGLXPbufferSGIX GLH_EXT_NAME(glXQueryGLXPbufferSGIX) +# endif +# ifdef GLX_VERSION_1_3 +#define glXSelectEventSGIX GLH_EXT_NAME(glXSelectEventSGIX) +# endif +# ifdef GLX_VERSION_1_3 +#define glXGetSelectedEventSGIX GLH_EXT_NAME(glXGetSelectedEventSGIX) +# endif +#endif + +#ifdef GLX_SGIX_fbconfig +# ifdef GLX_VERSION_1_3 +#define glXGetFBConfigAttribSGIX GLH_EXT_NAME(glXGetFBConfigAttribSGIX) +# endif +# ifdef GLX_VERSION_1_3 +#define glXChooseFBConfigSGIX GLH_EXT_NAME(glXChooseFBConfigSGIX) +# endif +# ifdef GLX_VERSION_1_3 +#define glXCreateGLXPixmapWithConfigSGIX GLH_EXT_NAME(glXCreateGLXPixmapWithConfigSGIX) +# endif +# ifdef GLX_VERSION_1_3 +#define glXCreateContextWithConfigSGIX GLH_EXT_NAME(glXCreateContextWithConfigSGIX) +# endif +# ifdef GLX_VERSION_1_3 +#define glXGetVisualFromFBConfigSGIX GLH_EXT_NAME(glXGetVisualFromFBConfigSGIX) +# endif +# ifdef GLX_VERSION_1_3 +#define glXGetFBConfigFromVisualSGIX GLH_EXT_NAME(glXGetFBConfigFromVisualSGIX) +# endif +#endif + + +#endif diff --git a/linden/indra/newview/CMakeLists.txt b/linden/indra/newview/CMakeLists.txt index b085a9c..209fba4 100644 --- a/linden/indra/newview/CMakeLists.txt +++ b/linden/indra/newview/CMakeLists.txt @@ -437,9 +437,10 @@ set(viewer_SOURCE_FILES llxmlrpctransaction.cpp noise.cpp pipeline.cpp + RRInterface.cpp ) -set(VIEWER_BINARY_NAME "rainbowviewer-bin" CACHE STRING +set(VIEWER_BINARY_NAME "coolviewer-bin" CACHE STRING "The name of the viewer executable to create.") if (LINUX) @@ -846,6 +847,7 @@ set(viewer_HEADER_FILES randgauss.h VertexCache.h VorbisFramework.h + RRInterface.h ) source_group("CMake Rules" FILES ViewerInstall.cmake) @@ -869,8 +871,8 @@ if (DARWIN) secondlife.icns macview.r gpu_table.txt - Info-RainbowViewer.plist - RainbowViewer.nib/ + Info-CoolViewer.plist + CoolViewer.nib/ # CMake doesn't seem to support Xcode language variants well just yet English.lproj/InfoPlist.strings English.lproj/language.txt @@ -1443,13 +1445,13 @@ set(ARTWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH if (LINUX) add_custom_command( - OUTPUT rainbowviewer-stripped + OUTPUT coolviewer-stripped COMMAND strip - ARGS --strip-debug -o rainbowviewer-stripped ${VIEWER_BINARY_NAME} + ARGS --strip-debug -o coolviewer-stripped ${VIEWER_BINARY_NAME} DEPENDS ${VIEWER_BINARY_NAME} ) - set(product RainbowViewer-${ARCH}-${viewer_VERSION}) + set(product CoolViewer-${ARCH}-${viewer_VERSION}) add_custom_command( OUTPUT ${product}.tar.bz2 @@ -1466,7 +1468,7 @@ if (LINUX) --build=${CMAKE_CURRENT_BINARY_DIR} --dest=${CMAKE_CURRENT_BINARY_DIR}/packaged --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched - DEPENDS rainbowviewer-stripped ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + DEPENDS coolviewer-stripped ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py ) if (NOT INSTALL) @@ -1476,16 +1478,16 @@ if (LINUX) endif (LINUX) if (DARWIN) - set(product "Rainbow Viewer") + set(product "Cool Viewer") set_target_properties( ${VIEWER_BINARY_NAME} PROPERTIES OUTPUT_NAME "${product}" MACOSX_BUNDLE_INFO_STRING "info string - localize me" MACOSX_BUNDLE_ICON_FILE "secondlife.icns" - MACOSX_BUNDLE_GUI_IDENTIFIER "Rainbow Viewer" + MACOSX_BUNDLE_GUI_IDENTIFIER "Cool Viewer" MACOSX_BUNDLE_LONG_VERSION_STRING "ververver" - MACOSX_BUNDLE_BUNDLE_NAME "Rainbow Viewer" + MACOSX_BUNDLE_BUNDLE_NAME "Cool Viewer" MACOSX_BUNDLE_SHORT_VERSION_STRING "asdf" MACOSX_BUNDLE_BUNDLE_VERSION "asdf" MACOSX_BUNDLE_COPYRIGHT "copyright linden lab 2007 - localize me and run me through a legal wringer" diff --git a/linden/indra/newview/RainbowViewer.nib/classes.nib b/linden/indra/newview/CoolViewer.nib/classes.nib similarity index 100% rename from linden/indra/newview/RainbowViewer.nib/classes.nib rename to linden/indra/newview/CoolViewer.nib/classes.nib diff --git a/linden/indra/newview/RainbowViewer.nib/info.nib b/linden/indra/newview/CoolViewer.nib/info.nib similarity index 100% rename from linden/indra/newview/RainbowViewer.nib/info.nib rename to linden/indra/newview/CoolViewer.nib/info.nib diff --git a/linden/indra/newview/RainbowViewer.nib/objects.xib b/linden/indra/newview/CoolViewer.nib/objects.xib similarity index 97% rename from linden/indra/newview/RainbowViewer.nib/objects.xib rename to linden/indra/newview/CoolViewer.nib/objects.xib index b8d396c..1909a8f 100644 --- a/linden/indra/newview/RainbowViewer.nib/objects.xib +++ b/linden/indra/newview/CoolViewer.nib/objects.xib @@ -6,17 +6,17 @@ - RainbowViewer + CoolViewer - Rainbow Viewer + Cool Viewer - Rainbow Viewer + Cool Viewer TRUE TRUE - About Rainbow Viewer + About Cool Viewer 0 abou @@ -24,7 +24,7 @@ _NSAppleMenu - + File File diff --git a/linden/indra/newview/English.lproj/InfoPlist.strings b/linden/indra/newview/English.lproj/InfoPlist.strings index dec2cbb..938b870 100644 --- a/linden/indra/newview/English.lproj/InfoPlist.strings +++ b/linden/indra/newview/English.lproj/InfoPlist.strings @@ -1,6 +1,6 @@ /* Localized versions of Info.plist keys */ -CFBundleName = "Rainbow Viewer"; -CFBundleShortVersionString = "Rainbow Viewer version 1.22.12.0 R4"; -CFBundleGetInfoString = "Rainbow Viewer version 1.22.12.0 R4, GPL, Boy Lane"; +CFBundleName = "Cool Viewer"; +CFBundleShortVersionString = "Rainbow Viewer::Cool Edition version 1.22.12.0 R11"; +CFBundleGetInfoString = "Rainbow Viewer::Cool Edition version 1.22.12.0 R11, GPL, Boy Lane"; diff --git a/linden/indra/newview/Info-RainbowViewer.plist b/linden/indra/newview/Info-CoolViewer.plist similarity index 93% rename from linden/indra/newview/Info-RainbowViewer.plist rename to linden/indra/newview/Info-CoolViewer.plist index e6a3979..6a9520e 100644 --- a/linden/indra/newview/Info-RainbowViewer.plist +++ b/linden/indra/newview/Info-CoolViewer.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion English CFBundleExecutable - Rainbow Viewer + Cool Viewer CFBundleIconFile secondlife.icns CFBundleIdentifier @@ -13,7 +13,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - Rainbow Viewer + Cool Viewer CFBundlePackageType APPL CFBundleSignature diff --git a/linden/indra/newview/Info-RainbowViewerVorbis.plist b/linden/indra/newview/Info-CoolViewerVorbis.plist similarity index 91% rename from linden/indra/newview/Info-RainbowViewerVorbis.plist rename to linden/indra/newview/Info-CoolViewerVorbis.plist index 2383098..9a43b52 100644 --- a/linden/indra/newview/Info-RainbowViewerVorbis.plist +++ b/linden/indra/newview/Info-CoolViewerVorbis.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion English CFBundleExecutable - RainbowViewerVorbis + CoolViewerVorbis CFBundleGetInfoString CFBundleIconFile @@ -15,7 +15,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - RainbowViewerVorbis + CoolViewerVorbis CFBundlePackageType FMWK CFBundleShortVersionString diff --git a/linden/indra/newview/RRInterface.cpp b/linden/indra/newview/RRInterface.cpp new file mode 100644 index 0000000..8848c07 --- /dev/null +++ b/linden/indra/newview/RRInterface.cpp @@ -0,0 +1,2581 @@ +#include "llviewerprecompiledheaders.h" + +#include "llagent.h" +#include "lldrawpoolalpha.h" +#include "llfloaterchat.h" +#include "llfloaterdaycycle.h" +#include "llfloaterenvsettings.h" +#include "llfloatermap.h" +#include "llfloaterpostprocess.h" +#include "llfloatersettingsdebug.h" +#include "llfloaterwater.h" +#include "llfloaterwindlight.h" +#include "llfloaterworldmap.h" +#include "llfocusmgr.h" +#include "llhudtext.h" +#include "llselectmgr.h" +#include "llstartup.h" +#include "llvoavatar.h" +#include "llinventoryview.h" +#include "lloverlaybar.h" +#include "llurlsimstring.h" +#include "lltracker.h" +#include "llviewermenu.h" +#include "llviewerobjectlist.h" +#include "llviewerwindow.h" +#include "llwaterparammanager.h" +#include "llwlparammanager.h" +#include "llinventorybridge.h" +#include "llviewerregion.h" +#include "llviewermessage.h" +#include "pipeline.h" + +#include "RRInterface.h" + +extern BOOL RRNoSetEnv; + +#if !defined(max) +#define max(a, b) ((a) > (b) ? (a) : (b)) +#endif + +// -- +// Local functions +std::string dumpList2String (std::deque list, std::string sep, int size = -1) +{ + bool found_one = false; + if (size < 0) size = (int)list.size(); + std::string res = ""; + for (int i = 0; i < (int)list.size() && i < size; ++i) { + if (found_one) res += sep; + found_one = true; + res += list[i]; + } + return res; +} + +int match (std::deque list, std::string str) +{ + // does str contain list[0]/list[1]/.../list[n] ? + // yes => return the size of the list + // no => try again after removing the last element + // return 0 if never found + // Exception : if str starts with a "~" character, the match must be exact + unsigned int size = list.size(); + std::string dump; + while (size > 0) { + dump = dumpList2String (list, "/", (int)size); + if (str != "" && str[0] == '~' && str != dump) return 0; + if (str.find (dump) != -1) return (int)size; + size--; + } + return 0; +} + +std::deque getSubList (std::deque list, int min, int max = -1) +{ + if (min < 0) min = 0; + if (max < 0) max = list.size() - 1; + std::deque res; + for (int i = min; i <= max; ++i) { + res.push_back (list[i]); + } + return res; +} + +bool findMultiple (std::deque list, std::string str) +{ + // returns true if all the tokens in list are contained into str + unsigned int size = list.size(); + for (unsigned int i = 0; i < size; i++) { + if (str.find (list[i]) == -1) return false; + } + return true; +} + +void refreshCachedVariable (std::string var) +{ + // Call this function when adding/removing a restriction only, i.e. in this file + // Test the cached variables in the code of the viewer itself + BOOL contained = gAgent.mRRInterface.contains (var); + if (var == "detach" || var.find ("detach:") == 0 || var.find ("addattach") == 0 || var.find ("remattach") == 0) { + contained = gAgent.mRRInterface.contains("detach") + || gAgent.mRRInterface.containsSubstr("detach:") + || gAgent.mRRInterface.containsSubstr("addattach") + || gAgent.mRRInterface.containsSubstr("remattach"); + gAgent.mRRInterface.mContainsDetach = contained; + gAgent.mRRInterface.mHasLockedHuds = gAgent.mRRInterface.hasLockedHuds(); + if (gAgent.mRRInterface.mHasLockedHuds) { + // To force the viewer to render the HUDs again, just in case + LLPipeline::sShowHUDAttachments = TRUE; + } + } + else if (var == "showinv") gAgent.mRRInterface.mContainsShowinv = contained; + else if (var == "unsit") gAgent.mRRInterface.mContainsUnsit = contained; + else if (var == "fartouch") gAgent.mRRInterface.mContainsFartouch = contained; + else if (var == "showworldmap") gAgent.mRRInterface.mContainsShowworldmap = contained; + else if (var == "showminimap") gAgent.mRRInterface.mContainsShowminimap = contained; + else if (var == "showloc") gAgent.mRRInterface.mContainsShowloc = contained; + else if (var == "shownames") gAgent.mRRInterface.mContainsShownames = contained; + else if (var == "setenv") gAgent.mRRInterface.mContainsSetenv = contained; + else if (var == "fly") gAgent.mRRInterface.mContainsFly = contained; + else if (var == "edit") gAgent.mRRInterface.mContainsEdit = contained; + else if (var == "rez") gAgent.mRRInterface.mContainsRez = contained; + else if (var == "showhovertextall") gAgent.mRRInterface.mContainsShowhovertextall = contained; + else if (var == "showhovertexthud") gAgent.mRRInterface.mContainsShowhovertexthud = contained; + else if (var == "showhovertextworld") gAgent.mRRInterface.mContainsShowhovertextworld = contained; + else if (var == "defaultwear") gAgent.mRRInterface.mContainsDefaultwear = contained; + else if (var == "permissive") gAgent.mRRInterface.mContainsPermissive = contained; +} + +std::string getFirstName (std::string fullName) +{ + int ind = fullName.find (" "); + if (ind != -1) return fullName.substr (0, ind); + else return fullName; +} + +std::string getLastName (std::string fullName) +{ + int ind = fullName.find (" "); + if (ind != -1) return fullName.substr (ind+1); + else return fullName; +} + +void updateAllHudTexts () +{ + LLHUDText::TextObjectIterator text_it; + + for (text_it = LLHUDText::sTextObjects.begin(); + text_it != LLHUDText::sTextObjects.end(); + ++text_it) + { + LLHUDText *hudText = *text_it; + if (hudText && hudText->mLastMessageText != "") { + // do not update the floating names of the avatars around + LLViewerObject* obj = hudText->getSourceObject(); + if (obj && !obj->isAvatar()) { + hudText->setStringUTF8(hudText->mLastMessageText); + } + } + } +} + +void updateOneHudText (LLUUID uuid) +{ + LLViewerObject* obj = gObjectList.findObject(uuid); + if (obj) { + if (obj->mText.notNull()) { + LLHUDText *hudText = obj->mText.get(); + if (hudText && hudText->mLastMessageText != "") { + hudText->setStringUTF8(hudText->mLastMessageText); + } + } + } +} +// -- + + + + + +RRInterface::RRInterface(): + sInventoryFetched(FALSE), + sAllowCancelTp(TRUE), + sSitTargetId(), + sLastLoadedPreset(), + sTimeBeforeReattaching(0) +{ + sAllowedS32 = ","; + + sAllowedU32 = + ",AvatarSex" // 0 female, 1 male + ",RenderResolutionDivisor" // simulate blur, default is 1 + ","; + + sAllowedF32 = ","; + sAllowedBOOLEAN = ","; + sAllowedSTRING = ","; + sAllowedVEC3 = ","; + sAllowedVEC3D = ","; + sAllowedRECT = ","; + sAllowedCOL4 = ","; + sAllowedCOL3 = ","; + sAllowedCOL4U = ","; + + sAssetsToReattach.clear(); + + sJustDetached.uuid.setNull(); + sJustDetached.attachpt = ""; + sJustReattached.uuid.setNull(); + sJustReattached.attachpt = ""; +} + +RRInterface::~RRInterface() +{ +} + +std::string RRInterface::getVersion () +{ + return RR_VIEWER_NAME" viewer v"RR_VERSION" ("RR_SLV_VERSION")"; // there is no '+' between the string and the macro +} + +BOOL RRInterface::isAllowed (LLUUID object_uuid, std::string action, BOOL log_it) +{ + BOOL debug = gSavedSettings.getBOOL("RestrainedLifeDebug") && log_it; + if (debug) { + llinfos << object_uuid.asString() << " " << action << llendl; + } + RRMAP::iterator it = sSpecialObjectBehaviours.find (object_uuid.asString()); + while (it != sSpecialObjectBehaviours.end() && + it != sSpecialObjectBehaviours.upper_bound(object_uuid.asString())) + { + if (debug) { + llinfos << " checking " << it->second << llendl; + } + if (it->second == action) { + if (debug) { + llinfos << " => forbidden. " << llendl; + } + return FALSE; + } + it++; + } + if (debug) { + llinfos << " => allowed. " << llendl; + } + return TRUE; +} + +BOOL RRInterface::contains (std::string action) +{ + RRMAP::iterator it = sSpecialObjectBehaviours.begin (); + LLStringUtil::toLower(action); +// llinfos << "looking for " << action << llendl; + while (it != sSpecialObjectBehaviours.end()) { + if (it->second == action) { +// llinfos << "found " << it->second << llendl; + return TRUE; + } + it++; + } + return FALSE; +} + +BOOL RRInterface::containsSubstr (std::string action) +{ + RRMAP::iterator it = sSpecialObjectBehaviours.begin (); + LLStringUtil::toLower(action); +// llinfos << "looking for " << action << llendl; + while (it != sSpecialObjectBehaviours.end()) { + if (it->second.find (action) != -1) { +// llinfos << "found " << it->second << llendl; + return TRUE; + } + it++; + } + return FALSE; +} + +BOOL RRInterface::containsWithoutException (std::string action, std::string except /* = "" */) +{ + // action is a restriction like @sendim, which can accept exceptions (@sendim:except_uuid=add) + // action_sec is the same action, with "_sec" appended (like @sendim_sec) + + LLStringUtil::toLower(action); + std::string action_sec = action + "_sec"; + LLUUID uuid; + + // 1. If except is empty, behave like contains(), but looking for both action and action_sec + if (except == "") { + return (contains (action) || contains (action_sec)); + } + + // 2. For each action_sec, if we don't find an exception tied to the same object, return TRUE + // if @permissive is set, then even action needs the exception to be tied to the same object, not just action_sec + // (@permissive restrains the scope of all the exceptions to their own objects) + RRMAP::iterator it = sSpecialObjectBehaviours.begin (); + while (it != sSpecialObjectBehaviours.end()) { + if (it->second == action_sec + || it->second == action && mContainsPermissive) { + uuid.set (it->first); + if (isAllowed (uuid, action+":"+except, FALSE) && isAllowed (uuid, action_sec+":"+except, FALSE)) { // we use isAllowed because we need to check the object, but it really means "does not contain" + return TRUE; + } + } + it++; + } + + // 3. If we didn't return yet, but the map contains action, just look for except_uuid without regard to its object, if none is found return TRUE + if (contains (action)) { + if (!contains (action+":"+except) && !contains (action_sec+":"+except)) { + return TRUE; + } + } + + // 4. Finally return FALSE if we didn't find anything + return FALSE; +} + +BOOL RRInterface::add (LLUUID object_uuid, std::string action, std::string option) +{ + if (gSavedSettings.getBOOL("RestrainedLifeDebug")) { + llinfos << object_uuid.asString() << " " << action << " " << option << llendl; + } + + std::string canon_action = action; + if (option!="") action+=":"+option; + + if (isAllowed (object_uuid, action)) { + // Notify if needed + notify (object_uuid, action, "=n"); + + // Actions to do BEFORE inserting the new behav + if (action=="showinv") { + //LLInventoryView::cleanup (); + for (int i=0; igetVisible()) { + LLInventoryView::sActiveViews.get(i)->setVisible (false); + } + } + } + else if (action=="showminimap") { + gFloaterMap->setVisible(FALSE); + } + else if (action=="shownames") { + LLFloaterChat::getInstance()->childSetVisible("active_speakers_panel", FALSE); + } + else if (action=="fly") { + gAgent.setFlying (FALSE); + } + else if (action=="showworldmap" || action == "showloc") { + if (gFloaterWorldMap->getVisible()) { + LLFloaterWorldMap::toggle(NULL); + } + } + else if (action=="edit") { + LLPipeline::setRenderBeacons(FALSE); + LLPipeline::setRenderScriptedBeacons(FALSE); + LLPipeline::setRenderScriptedTouchBeacons(FALSE); + LLPipeline::setRenderPhysicalBeacons(FALSE); + LLPipeline::setRenderSoundBeacons(FALSE); + LLPipeline::setRenderParticleBeacons(FALSE); + LLPipeline::setRenderHighlights(FALSE); + LLDrawPoolAlpha::sShowDebugAlpha = FALSE; + } + else if (action=="setenv") { + if (RRNoSetEnv) { + return TRUE; + } + LLFloaterEnvSettings::instance()->close(); + LLFloaterWater::instance()->close(); + LLFloaterPostProcess::instance()->close(); + LLFloaterDayCycle::instance()->close(); + LLFloaterWindLight::instance()->close(); + gSavedSettings.setBOOL("VertexShaderEnable", TRUE); + gSavedSettings.setBOOL("WindLightUseAtmosShaders", TRUE); + } + else if (action=="setdebug") { + if (!RRNoSetEnv) { + gSavedSettings.setBOOL("VertexShaderEnable", TRUE); + gSavedSettings.setBOOL("WindLightUseAtmosShaders", TRUE); + } + } + + // Insert the new behav + sSpecialObjectBehaviours.insert(std::pair(object_uuid.asString(), action)); + refreshCachedVariable(action); + + // Actions to do AFTER inserting the new behav + if (action=="showhovertextall" || action=="showloc" || action=="shownames" + || action=="showhovertexthud" || action=="showhovertextworld" ) { + updateAllHudTexts(); + } + if (canon_action == "showhovertext") { + updateOneHudText(LLUUID(option)); + } + return TRUE; + } + return FALSE; +} + +BOOL RRInterface::remove (LLUUID object_uuid, std::string action, std::string option) +{ + BOOL debug = gSavedSettings.getBOOL("RestrainedLifeDebug"); + if (debug) { + llinfos << object_uuid.asString() << " " << action << " " << option << llendl; + } + + std::string canon_action = action; + if (option!="") action+=":"+option; + + // Notify if needed + notify (object_uuid, action, "=y"); + + // Actions to do BEFORE removing the behav + + // Remove the behav + RRMAP::iterator it = sSpecialObjectBehaviours.find (object_uuid.asString()); + while (it != sSpecialObjectBehaviours.end() && + it != sSpecialObjectBehaviours.upper_bound(object_uuid.asString())) + { + if (debug) { + llinfos << " checking " << it->second << llendl; + } + if (it->second == action) { + sSpecialObjectBehaviours.erase(it); + if (debug) { + llinfos << " => removed. " << llendl; + } + refreshCachedVariable(action); + + // Actions to do AFTER removing the behav + if (action=="showhovertextall" || action=="showloc" || action=="shownames" + || action=="showhovertexthud" || action=="showhovertextworld" ) { + updateAllHudTexts(); + } + if (canon_action == "showhovertext") { + updateOneHudText(LLUUID(option)); + } + + return TRUE; + } + it++; + } + + return FALSE; +} + +BOOL RRInterface::clear (LLUUID object_uuid, std::string command) +{ + BOOL debug = gSavedSettings.getBOOL("RestrainedLifeDebug"); + if (debug) { + llinfos << object_uuid.asString() << " / " << command << llendl; + } + + // Notify if needed + notify (object_uuid, "clear" + (command!=""? ":"+command : ""), ""); + + RRMAP::iterator it; + it = sSpecialObjectBehaviours.begin (); + while (it != sSpecialObjectBehaviours.end()) { + if (debug) { + llinfos << " checking " << it->second << llendl; + } + if (it->first==object_uuid.asString() && (command=="" || it->second.find (command)!=-1)) { + if (debug) { + llinfos << it->second << " => removed. " << llendl; + } + std::string tmp = it->second; + sSpecialObjectBehaviours.erase(it); + refreshCachedVariable(tmp); + it = sSpecialObjectBehaviours.begin (); + } + else { + it++; + } + } + updateAllHudTexts(); + return TRUE; +} + +void RRInterface::replace (LLUUID what, LLUUID by) +{ + RRMAP::iterator it; + LLUUID uuid; + it = sSpecialObjectBehaviours.begin (); + while (it != sSpecialObjectBehaviours.end()) { + uuid.set (it->first); + if (uuid == what) { + // found the UUID to replace => add a copy of the command with the new UUID + sSpecialObjectBehaviours.insert(std::pair(by.asString(), it->second)); + } + it++; + } + // and then clear the old UUID + clear (what, ""); +} + + +BOOL RRInterface::garbageCollector (BOOL all) { + BOOL debug = gSavedSettings.getBOOL("RestrainedLifeDebug"); + RRMAP::iterator it; + BOOL res=FALSE; + LLUUID uuid; + LLViewerObject *objp=NULL; + it = sSpecialObjectBehaviours.begin (); + while (it != sSpecialObjectBehaviours.end()) { + uuid.set (it->first); + if (all || !uuid.isNull ()) { +// if (debug) { +// llinfos << "testing " << it->first << llendl; +// } + objp = gObjectList.findObject(uuid); + if (!objp) { + if (debug) { + llinfos << it->first << " not found => cleaning... " << llendl; + } + clear (uuid); + res=TRUE; + it=sSpecialObjectBehaviours.begin (); + } else { + it++; + } + } else { + if (debug) { + llinfos << "ignoring " << it->second << llendl; + } + it++; + } + } + return res; +} + +std::deque RRInterface::parse (std::string str, std::string sep) +{ + int ind; + int length = sep.length(); + std::deque res; + + do { + ind=str.find(sep); + if (ind!=-1) { + res.push_back (str.substr (0, ind)); + str=str.substr (ind+length); + } + else { + res.push_back (str); + } + } while (ind!=-1); + + return res; +} + + +void RRInterface::notify (LLUUID object_uuid, std::string action, std::string suffix) +{ + // scan the list of restrictions, when finding "notify" say the restriction on the specified channel + RRMAP::iterator it; + int length = 7; // size of "notify:" + int size; + std::deque tokens; + LLUUID uuid; + std::string rule; + it = sSpecialObjectBehaviours.begin (); + + while (it != sSpecialObjectBehaviours.end()) { + uuid.set (it->first); + rule = it->second; // we are looking for rules like "notify:2222;tp", if action contains "tp" then notify the scripts on channel 2222 + if (rule.find("notify:") == 0) { + // found a possible notification to send + rule = rule.substr(length); // keep right part only (here "2222;tp") + tokens = parse (rule, ";"); + size = tokens.size(); + if (size == 1 || size > 1 && action.find(tokens[1]) != -1) { + answerOnChat(tokens[0], "/" + action + suffix); // suffix can be "=n", "=y" or whatever else we want, "/" is needed to avoid some clever griefing + } + } + it++; + } +} + + +BOOL RRInterface::parseCommand (std::string command, std::string& behaviour, std::string& option, std::string& param) +{ + int ind = command.find("="); + behaviour=command; + option=""; + param=""; + if (ind!=-1) { + behaviour=command.substr(0, ind); + param=command.substr(ind+1); + ind=behaviour.find(":"); + if (ind!=-1) { + option=behaviour.substr(ind+1); + behaviour=behaviour.substr(0, ind); // keep in this order (option first, then behav) or crash + } + return TRUE; + } + return FALSE; +} + +BOOL RRInterface::handleCommand (LLUUID uuid, std::string command) +{ + BOOL debug = gSavedSettings.getBOOL("RestrainedLifeDebug"); + // 1. check the command is actually a single one or a list of commands separated by "," + if (command.find (",")!=-1) { + BOOL res=TRUE; + std::deque list_of_commands=parse (command, ","); + for (unsigned int i=0; i 0)) { + Command cmd; + cmd.uuid=uuid; + cmd.command=command; + if (debug) { + llinfos << "Retaining command : " << command << llendl; + } + sRetainedCommands.push_back (cmd); + return TRUE; + } + + // 3. parse the command, which is of one of these forms : + // behav=param + // behav:option=param + std::string behav; + std::string option; + std::string param; + LLStringUtil::toLower(command); + if (parseCommand (command, behav, option, param)) // detach=n, recvchat=n, recvim=n, unsit=n, recvim:=add, clear=tplure: + { + if (debug) { + llinfos << "[" << uuid.asString() << "] [" << behav << "] [" << option << "] [" << param << "]" << llendl; + } + if (behav=="version") return answerOnChat (param, getVersion ()); + else if (behav=="versionnum") return answerOnChat (param, RR_VERSION_NUM); + else if (behav=="getoutfit") return answerOnChat (param, getOutfit (option)); + else if (behav=="getattach") return answerOnChat (param, getAttachments (option)); + else if (behav=="getstatus") return answerOnChat (param, getStatus (uuid, option)); + else if (behav=="getstatusall") { + uuid.setNull(); + return answerOnChat (param, getStatus (uuid, option)); + } + else if (behav=="getinv") return answerOnChat (param, getInventoryList (option)); + else if (behav=="getinvworn") return answerOnChat (param, getInventoryList (option, TRUE)); + else if (behav=="getsitid") return answerOnChat (param, getSitTargetId ().asString()); + else if (behav=="getpath") return answerOnChat (param, getFullPath (getItem(uuid), option)); // option can be empty (=> find path to object) or the name of an attach pt or the name of a clothing layer + else if (behav=="findfolder") return answerOnChat (param, getFullPath (findCategoryUnderRlvShare (option))); + else if (behav.find ("getenv_") == 0) return answerOnChat (param, getEnvironment (behav)); + else if (behav.find ("getdebug_") == 0) return answerOnChat (param, getDebugSetting (behav)); + else { + if (param=="n" || param=="add") add (uuid, behav, option); + else if (param=="y" || param=="rem") remove (uuid, behav, option); + else if (behav=="clear") clear (uuid, param); + else if (param=="force") force (uuid, behav, option); + else return FALSE; + } + } + else // clear + { + if (debug) { + llinfos << uuid.asString() << " " << behav << llendl; + } + if (behav=="clear") clear (uuid); + else return FALSE; + } + return TRUE; +} + +BOOL RRInterface::fireCommands () +{ + BOOL ok=TRUE; + if (sRetainedCommands.size ()) { + if (gSavedSettings.getBOOL("RestrainedLifeDebug")) { + llinfos << "Firing commands : " << sRetainedCommands.size () << llendl; + } + Command cmd; + while (!sRetainedCommands.empty ()) { + cmd=sRetainedCommands[0]; + ok=ok & handleCommand (cmd.uuid, cmd.command); + sRetainedCommands.pop_front (); + } + } + return ok; +} + +static void force_sit(LLUUID object_uuid) +{ + // Note : Although it would make sense that only the UUID should be needed, we actually need to send an + // offset to the sim, therefore we need the object to be known to the viewer. In other words, issuing @sit=force + // right after a teleport is not going to work because the object will not have had time to rez. + LLViewerObject *object = gObjectList.findObject(object_uuid); + if (object) { + LLVOAvatar* avatar = gAgent.getAvatarObject(); + if (avatar && gAgent.mRRInterface.mContainsUnsit && avatar->mIsSitting) { + // Do not allow a script to force the avatar to sit somewhere if already forced to stay sitting here + return; + } + if (gAgent.mRRInterface.contains ("sit")) + { + return; + } + if (gAgent.mRRInterface.contains ("sittp")) { + // Do not allow a script to force the avatar to sit somewhere far when under @sittp + LLVector3 pos = object->getPositionRegion(); + pos -= gAgent.getPositionAgent (); + if (pos.magVec () >= 1.5) + { + return; + } + } + gMessageSystem->newMessageFast(_PREHASH_AgentRequestSit); + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + gMessageSystem->nextBlockFast(_PREHASH_TargetObject); + gMessageSystem->addUUIDFast(_PREHASH_TargetID, object->mID); + gMessageSystem->addVector3Fast(_PREHASH_Offset, + gAgent.calcFocusOffset(object, gAgent.getPositionAgent(), (S32)0.0f, (S32)0.0f)); + object->getRegion()->sendReliableMessage(); + } +} + + +BOOL RRInterface::force (LLUUID object_uuid, std::string command, std::string option) +{ + BOOL debug = gSavedSettings.getBOOL("RestrainedLifeDebug"); + if (debug) { + llinfos << command << " " << option << llendl; + } + if (command=="sit") { // sit:UUID + BOOL allowed_to_sittp=TRUE; + if (!isAllowed (object_uuid, "sittp")) { + allowed_to_sittp=FALSE; + remove (object_uuid, "sittp", ""); + } + LLUUID uuid (option); + force_sit (uuid); + if (!allowed_to_sittp) add (object_uuid, "sittp", ""); + } + else if (command=="unsit") { // unsit + if (debug) { + llinfos << "trying to unsit" << llendl; + } + if (gAgent.getAvatarObject() && + gAgent.getAvatarObject()->mIsSitting) { + if (debug) { + llinfos << "found avatar object" << llendl; + } + if (gAgent.mRRInterface.mContainsUnsit) { + if (debug) { + llinfos << "prevented from unsitting" << llendl; + } + return TRUE; + } + if (debug) { + llinfos << "unsitting agent" << llendl; + } + LLOverlayBar::onClickStandUp(NULL); + send_agent_update(TRUE, TRUE); + } + } + else if (command=="remoutfit") { // remoutfit:shoes + if (option=="") { + gAgent.removeWearable (WT_GLOVES); + gAgent.removeWearable (WT_JACKET); + gAgent.removeWearable (WT_PANTS); + gAgent.removeWearable (WT_SHIRT); + gAgent.removeWearable (WT_SHOES); + gAgent.removeWearable (WT_SKIRT); + gAgent.removeWearable (WT_SOCKS); + gAgent.removeWearable (WT_UNDERPANTS); + gAgent.removeWearable (WT_UNDERSHIRT); + } + else { + EWearableType type = getOutfitLayerAsType (option); + if (type != WT_INVALID) { + // clothes and hair only, not skin, eyes, or shape + if (type == WT_HAIR || LLWearable::typeToAssetType(type) == LLAssetType::AT_CLOTHING) { + gAgent.removeWearable (type); // remove by layer + } + } + else forceDetachByName (option); // remove by category (in RLV share) + } + } + else if (command=="detach" || command=="remattach") { // detach:chest=force OR detach:restraints/cuffs=force (@remattach is a synonym) + LLViewerJointAttachment* attachpt = findAttachmentPointFromName (option, TRUE); // exact name + if (attachpt != NULL || option == "") return forceDetach (option); // remove by attach pt + else forceDetachByName (option); + } + else if (command=="detachme") { // detachme=force to detach this object specifically + return forceDetachByUuid (object_uuid.asString()); // remove by uuid + } + else if (command=="detachthis") { // detachthis=force to detach the folder containing this object + return forceDetachByName (getFullPath (getItem(object_uuid), option), FALSE); + } + else if (command=="detachall") { // detachall:cuffs=force to detach a folder and its subfolders + return forceDetachByName (option, TRUE); + } + else if (command=="detachallthis") { // detachallthis=force to detach the folder containing this object and also its subfolders + return forceDetachByName (getFullPath (getItem(object_uuid), option), TRUE); + } + else if (command=="tpto") { // tpto:X/Y/Z=force (X, Y, Z are GLOBAL coordinates) + BOOL allowed_to_tploc=TRUE; + BOOL allowed_to_unsit=TRUE; + BOOL res; + if (!isAllowed (object_uuid, "tploc")) { + allowed_to_tploc=FALSE; + remove (object_uuid, "tploc", ""); + } + if (!isAllowed (object_uuid, "unsit")) { + allowed_to_unsit=FALSE; + remove (object_uuid, "unsit", ""); + } + res = forceTeleport (option); + if (!allowed_to_tploc) add (object_uuid, "tploc", ""); + if (!allowed_to_unsit) add (object_uuid, "unsit", ""); + return res; + } + else if (command=="attach" || command == "addoutfit") { // attach:cuffs=force + return forceAttach (option); + } + else if (command=="attachthis") { // attachthis=force to attach the folder containing this object + return forceAttach (getFullPath (getItem(object_uuid), option), FALSE); + } + else if (command=="attachall") { // attachall:cuffs=force to attach a folder and its subfolders + return forceAttach (option, TRUE); + } + else if (command=="attachallthis") { // attachallthis=force to attach the folder containing this object and its subfolders + return forceAttach (getFullPath (getItem(object_uuid), option), TRUE); + } + else if (command.find ("setenv_") == 0) { + BOOL res = TRUE; + BOOL allowed = TRUE; + if (!RRNoSetEnv) { + if (!isAllowed (object_uuid, "setenv")) { + allowed=FALSE; + remove (object_uuid, "setenv", ""); + } + if (!mContainsSetenv) res = forceEnvironment (command, option); + if (!allowed) add (object_uuid, "setenv", ""); + } + return res; + } + else if (command.find ("setdebug_") == 0) { + BOOL res = TRUE; + BOOL allowed = TRUE; + if (!isAllowed (object_uuid, "setdebug")) { + allowed=FALSE; + remove (object_uuid, "setdebug", ""); + } + if (!contains("setdebug")) res = forceDebugSetting (command, option); + if (!allowed) add (object_uuid, "setdebug", ""); + return res; + } + else if (command=="setrot") { // setrot:angle_radians=force + BOOL res = TRUE; + LLVOAvatar* avatar = gAgent.getAvatarObject(); + if (!avatar) return FALSE; + F32 val = atof (option.c_str()); + gAgent.startCameraAnimation(); + LLVector3 rot (0.0, 1.0, 0.0); + rot = rot.rotVec(-val, LLVector3::z_axis); + rot.normalize(); + gAgent.resetAxes(rot); + return res; + } + return TRUE; +} + +BOOL RRInterface::answerOnChat (std::string channel, std::string msg) +{ + if (channel == "0") return FALSE; // protection against abusive "@getstatus=0" commands + if (atoi (channel.c_str()) <= 0) return FALSE; // prevent from trying to say something on a negative channel, or on a non-numerical channel + gChatBar->sendChatFromViewer("/"+channel+" "+msg, CHAT_TYPE_SHOUT, FALSE); + if (gSavedSettings.getBOOL("RestrainedLifeDebug")) { + llinfos << "/" << channel << " " << msg << llendl; + } + return TRUE; +} + +std::string RRInterface::crunchEmote (std::string msg, unsigned int truncateTo) { + std::string crunched = msg; + + if (msg.find ("/me ") == 0 || msg.find ("/me'") == 0) { + // Only allow emotes without "spoken" text. + // Forbid text containing any symbol which could be used as quotes. + if (msg.find ("\"") != -1 || msg.find ("''") != -1 + || msg.find ("(") != -1 || msg.find (")") != -1 + || msg.find (" -") != -1 || msg.find ("- ") != -1 + || msg.find ("*") != -1 || msg.find ("=") != -1 + || msg.find ("^") != -1 || msg.find ("_") != -1 + || msg.find ("?") != -1 || msg.find ("~") != -1) + { + crunched = "..."; + } + else if (!contains ("emote")) { + // Only allow short emotes. + int i = msg.find ("."); + if (i != -1) { + crunched = msg.substr (0, ++i); + } + if (crunched.length () > truncateTo) { + crunched = crunched.substr (0, truncateTo); + } + } + } + else if (msg.find ("/") == 0) { + // only allow short gesture names (to avoid cheats). + if (msg.length () > 7) { // allows things like "/ao off", "/hug X" + crunched = "..."; + } + } + else if (msg.find ("((") != 0 || msg.find ("))") != msg.length () - 2) { + // Only allow OOC chat, starting with "((" and ending with "))". + crunched = "..."; + } + return crunched; +} + +std::string RRInterface::getOutfitLayerAsString (EWearableType layer) +{ + switch (layer) { + case WT_SKIN: return WS_SKIN; + case WT_GLOVES: return WS_GLOVES; + case WT_JACKET: return WS_JACKET; + case WT_PANTS: return WS_PANTS; + case WT_SHIRT: return WS_SHIRT; + case WT_SHOES: return WS_SHOES; + case WT_SKIRT: return WS_SKIRT; + case WT_SOCKS: return WS_SOCKS; + case WT_UNDERPANTS: return WS_UNDERPANTS; + case WT_UNDERSHIRT: return WS_UNDERSHIRT; + case WT_EYES: return WS_EYES; + case WT_HAIR: return WS_HAIR; + case WT_SHAPE: return WS_SHAPE; + default: return ""; + } +} + +EWearableType RRInterface::getOutfitLayerAsType (std::string layer) +{ + if (layer==WS_SKIN) return WT_SKIN; + if (layer==WS_GLOVES) return WT_GLOVES; + if (layer==WS_JACKET) return WT_JACKET; + if (layer==WS_PANTS) return WT_PANTS; + if (layer==WS_SHIRT) return WT_SHIRT; + if (layer==WS_SHOES) return WT_SHOES; + if (layer==WS_SKIRT) return WT_SKIRT; + if (layer==WS_SOCKS) return WT_SOCKS; + if (layer==WS_UNDERPANTS) return WT_UNDERPANTS; + if (layer==WS_UNDERSHIRT) return WT_UNDERSHIRT; + if (layer==WS_EYES) return WT_EYES; + if (layer==WS_HAIR) return WT_HAIR; + if (layer==WS_SHAPE) return WT_SHAPE; + return WT_INVALID; +} + +std::string RRInterface::getOutfit (std::string layer) +{ + if (layer==WS_SKIN) return (gAgent.getWearable (WT_SKIN) != NULL? "1" : "0"); + if (layer==WS_GLOVES) return (gAgent.getWearable (WT_GLOVES) != NULL? "1" : "0"); + if (layer==WS_JACKET) return (gAgent.getWearable (WT_JACKET) != NULL? "1" : "0"); + if (layer==WS_PANTS) return (gAgent.getWearable (WT_PANTS) != NULL? "1" : "0"); + if (layer==WS_SHIRT)return (gAgent.getWearable (WT_SHIRT) != NULL? "1" : "0"); + if (layer==WS_SHOES) return (gAgent.getWearable (WT_SHOES) != NULL? "1" : "0"); + if (layer==WS_SKIRT) return (gAgent.getWearable (WT_SKIRT) != NULL? "1" : "0"); + if (layer==WS_SOCKS) return (gAgent.getWearable (WT_SOCKS) != NULL? "1" : "0"); + if (layer==WS_UNDERPANTS) return (gAgent.getWearable (WT_UNDERPANTS) != NULL? "1" : "0"); + if (layer==WS_UNDERSHIRT) return (gAgent.getWearable (WT_UNDERSHIRT) != NULL? "1" : "0"); + if (layer==WS_EYES) return (gAgent.getWearable (WT_EYES) != NULL? "1" : "0"); + if (layer==WS_HAIR) return (gAgent.getWearable (WT_HAIR) != NULL? "1" : "0"); + if (layer==WS_SHAPE) return (gAgent.getWearable (WT_SHAPE) != NULL? "1" : "0"); + return getOutfit (WS_GLOVES)+getOutfit (WS_JACKET)+getOutfit (WS_PANTS) + +getOutfit (WS_SHIRT)+getOutfit (WS_SHOES)+getOutfit (WS_SKIRT) + +getOutfit (WS_SOCKS)+getOutfit (WS_UNDERPANTS)+getOutfit (WS_UNDERSHIRT) + +getOutfit (WS_SKIN)+getOutfit (WS_EYES)+getOutfit (WS_HAIR)+getOutfit (WS_SHAPE); +} + +std::string RRInterface::getAttachments (std::string attachpt) +{ + BOOL debug = gSavedSettings.getBOOL("RestrainedLifeDebug"); + std::string res=""; + std::string name; + LLVOAvatar* avatar = gAgent.getAvatarObject(); + if (!avatar) { + llwarns << "NULL avatar pointer. Aborting." << llendl; + return res; + } + if (attachpt=="") res+="0"; // to match the LSL macros + for (LLVOAvatar::attachment_map_t::iterator iter = avatar->mAttachmentPoints.begin(); + iter != avatar->mAttachmentPoints.end(); iter++) + { + LLVOAvatar::attachment_map_t::iterator curiter = iter; + LLViewerJointAttachment* attachment = curiter->second; + name=attachment->getName (); + LLStringUtil::toLower(name); + if (debug) { + llinfos << "trying <" << name << ">" << llendl; + } + if (attachpt=="" || attachpt==name) { + if (!attachment->getItemID().isNull()) res+="1"; //attachment->getName (); + else res+="0"; + } + } + return res; +} + +std::string RRInterface::getStatus (LLUUID object_uuid, std::string rule) +{ + std::string res=""; + std::string name; + RRMAP::iterator it; + if (object_uuid.isNull()) { + it = sSpecialObjectBehaviours.begin(); + } + else { + it = sSpecialObjectBehaviours.find (object_uuid.asString()); + } + bool is_first=true; + while (it != sSpecialObjectBehaviours.end() && + (object_uuid.isNull() || it != sSpecialObjectBehaviours.upper_bound(object_uuid.asString())) + ) + { + if (rule=="" || it->second.find (rule)!=-1) { + //if (!is_first) + res+="/"; + res+=it->second; + is_first=false; + } + it++; + } + return res; +} + +BOOL RRInterface::forceDetach (std::string attachpt) +{ + BOOL debug = gSavedSettings.getBOOL("RestrainedLifeDebug"); + std::string name; + BOOL res=FALSE; + LLVOAvatar* avatar = gAgent.getAvatarObject(); + if (!avatar) return res; + for (LLVOAvatar::attachment_map_t::iterator iter = avatar->mAttachmentPoints.begin(); + iter != avatar->mAttachmentPoints.end(); iter++) + { + LLVOAvatar::attachment_map_t::iterator curiter = iter; + LLViewerJointAttachment* attachment = curiter->second; + name=attachment->getName (); + LLStringUtil::toLower(name); + if (debug) { + llinfos << "trying <" << name << ">" << llendl; + } + if (attachpt=="" || attachpt==name) { + if (debug) { + llinfos << "found => detaching" << llendl; + } + if (attachment->getObject()) { + handle_detach_from_avatar ((void*)attachment); + res=TRUE; + } + } + } + return res; +} + +BOOL RRInterface::forceDetachByUuid (std::string object_uuid) +{ + BOOL res=FALSE; + LLVOAvatar* avatar = gAgent.getAvatarObject(); + if (!avatar) return res; + LLViewerObject* object = gObjectList.findObject(LLUUID (object_uuid)); + if (object) { + for (LLVOAvatar::attachment_map_t::iterator iter = avatar->mAttachmentPoints.begin(); + iter != avatar->mAttachmentPoints.end(); iter++) + { + LLVOAvatar::attachment_map_t::iterator curiter = iter; + LLViewerJointAttachment* attachment = curiter->second; + if (attachment && attachment->getObject() == object) { + handle_detach_from_avatar ((void*)attachment); + res=TRUE; + } + } + } + return res; +} + +BOOL RRInterface::hasLockedHuds () +{ + LLVOAvatar* avatar = gAgent.getAvatarObject(); + if (!avatar) return FALSE; + for (LLVOAvatar::attachment_map_t::iterator iter = avatar->mAttachmentPoints.begin(); + iter != avatar->mAttachmentPoints.end(); iter++) + { + LLVOAvatar::attachment_map_t::iterator curiter = iter; + LLViewerJointAttachment* attachment = curiter->second; + LLViewerObject* obj; + if (attachment && (obj=attachment->getObject()) != NULL) { + if (obj->isHUDAttachment()) { + if (!canDetach(obj)) return TRUE; + } + } + } + return FALSE; +} + + +std::deque RRInterface::getListOfLockedItems (LLInventoryCategory* root) +{ + BOOL debug = gSavedSettings.getBOOL("RestrainedLifeDebug"); + LLVOAvatar* avatar = gAgent.getAvatarObject(); + std::deque res; + std::deque tmp; + res.clear(); + + if (root && avatar) { + + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + gInventory.getDirectDescendentsOf (root->getUUID(), cats, items); + S32 count; + S32 count_tmp; + S32 i; + S32 j; + LLInventoryItem* item = NULL; + LLInventoryCategory* cat = NULL; + // LLViewerObject* attached_object = NULL; + std::string attach_point_name = ""; + + // Try to find locked items in the current category + count = items->count(); + for (i = 0; i < count; ++i) { + item = items->get(i); + // If this is an object, add it if it is worn and locked, or worn and its attach point is locked + if (item && item->getType() == LLAssetType::AT_OBJECT) { + LLViewerObject* attached_object = avatar->getWornAttachment (item->getUUID()); + if (attached_object) { + attach_point_name = avatar->getAttachedPointName (item->getUUID()); + if (!gAgent.mRRInterface.canDetach(attached_object)) { + if (debug) { + llinfos << "found a locked object : " << item->getName() << " on " << attach_point_name << llendl; + } + res.push_back (item); + } + } + } + // If this is a piece of clothing, add it if the avatar can't unwear clothes, or if this layer itself can't be unworn + else if (item && item->getType() == LLAssetType::AT_CLOTHING) { + if (gAgent.mRRInterface.contains ("remoutfit") + || gAgent.mRRInterface.containsSubstr ("remoutfit:") + ) { + if (debug) { + llinfos << "found a locked clothing : " << item->getName() << llendl; + } + res.push_back (item); + } + } + } + + // We have all the locked objects contained directly in this folder, now add all the ones contained in children folders recursively + count = cats->count(); + for (i = 0; i < count; ++i) { + cat = cats->get(i); + tmp = getListOfLockedItems (cat); + count_tmp = tmp.size(); + for (j = 0; j < count_tmp; ++j) { + item = tmp[j]; + if (item) res.push_back (item); + } + } + + if (debug) { + llinfos << "number of locked objects under " << root->getName() << " = " << res.size() << llendl; + } + } + + return res; +} + + +std::string RRInterface::getInventoryList (std::string path, BOOL withWornInfo /* = FALSE */) +{ + std::string res = ""; + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + LLInventoryCategory* root = NULL; + if (path == "") root = getRlvShare(); + else root = getCategoryUnderRlvShare (path); + + if (root) { + gInventory.getDirectDescendentsOf (root->getUUID(), cats, items); + if(cats) { + S32 count = cats->count(); + bool found_one = false; + if (withWornInfo) { + res += "|" + getWornItems (root); + found_one = true; + } + for(S32 i = 0; i < count; ++i) { + LLInventoryCategory* cat = cats->get(i); + std::string name = cat->getName(); + if (name != "" && name[0] != '.') { // hidden folders => invisible to the list + if (found_one) res += ","; + res += name.c_str(); + if (withWornInfo) { + res += "|" + getWornItems (cat); + } + found_one = true; + } + } + } + } + + return res; +} + +std::string RRInterface::getWornItems (LLInventoryCategory* cat) +{ + // Returns a string of 2 digits according to the proportion of worn items in this folder and its children : + // First digit is this folder, second digit is children folders + // 0 : No item contained in the folder + // 1 : Some items contained but none is worn + // 2 : Some items contained and some of them are worn + // 3 : Some items contained and all of them are worn + std::string res_as_string = "0"; + int res = 0; + int subRes = 0; + int prevSubRes = 0; + int nbItems = 0; + int nbWorn = 0; + BOOL isNoMod = FALSE; + BOOL isRoot = (getRlvShare() == cat); + + // if cat exists, scan all the items inside it + if (cat) { + + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + + // retrieve all the objects contained in this folder + gInventory.getDirectDescendentsOf (cat->getUUID(), cats, items); + if (!isRoot && items) { // do not scan the shared root + + // scan them one by one + S32 count = items->count(); + for(S32 i = 0; i < count; ++i) { + + LLViewerInventoryItem* item = (LLViewerInventoryItem*)items->get(i); + + if (item) { + LLVOAvatar* avatar = gAgent.getAvatarObject(); + if (item->getType() == LLAssetType::AT_OBJECT + || item->getType() == LLAssetType::AT_CLOTHING + || item->getType() == LLAssetType::AT_BODYPART + ) { + nbItems++; + } + if( avatar && avatar->isWearingAttachment( item->getUUID() ) + || gAgent.isWearingItem (item->getUUID())) nbWorn++; + + // special case : this item is no-mod, hence we need to check its parent folder + // is correctly named, and that the item is alone in its folder. + // If so, then the calling method will have to deal with a special character instead + // of a number + if (count == 1 + && item->getType() == LLAssetType::AT_OBJECT + && !item->getPermissions().allowModifyBy(gAgent.getID())) { + if (findAttachmentPointFromName (cat->getName()) != NULL) { + isNoMod = TRUE; + } + } + } + } + } + + // scan every subfolder of the folder we are scanning, recursively + // note : in the case of no-mod items we shouldn't have sub-folders, so no need to check + if (cats && !isNoMod) { + + S32 count = cats->count(); + for(S32 i = 0; i < count; ++i) { + + LLViewerInventoryCategory* cat_child = (LLViewerInventoryCategory*)cats->get(i); + + if (cat_child) { + std::string tmp = getWornItems (cat_child); + // translate the result for no-mod items into something the upper levels can understand + if (tmp == "N") { + if (!isRoot) { + nbWorn++; + nbItems++; + } + } + else if (tmp== "n") { + if (!isRoot) { + nbItems++; + } + } + else if (cat_child->getName() != "" && cat_child->getName()[0] != '.') { // we don't want to include invisible folders, except the ones containing a no-mod item + // This is an actual sub-folder with several items and sub-folders inside, + // so retain its score to integrate it into the current one + // As it is a sub-folder, to integrate it we need to reduce its score first (consider "0" as "ignore") + // "00" = 0, "01" = 1, "10" = 1, "30" = 3, "03" = 3, "33" = 3, all the rest gives 2 (some worn, some not worn) + if (tmp == "00") subRes = 0; + else if (tmp == "11" || tmp == "01" || tmp == "10") subRes = 1; + else if (tmp == "33" || tmp == "03" || tmp == "30") subRes = 3; + else subRes = 2; + + // Then we must combine with the previous sibling sub-folders + // Same rule as above, set to 2 in all cases except when prevSubRes == subRes or when either == 0 (nothing present, ignore) + if (prevSubRes == 0 && subRes == 0) subRes = 0; + else if (prevSubRes == 0 && subRes == 1) subRes = 1; + else if (prevSubRes == 1 && subRes == 0) subRes = 1; + else if (prevSubRes == 1 && subRes == 1) subRes = 1; + else if (prevSubRes == 0 && subRes == 3) subRes = 3; + else if (prevSubRes == 3 && subRes == 0) subRes = 3; + else if (prevSubRes == 3 && subRes == 3) subRes = 3; + else subRes = 2; + prevSubRes = subRes; + } + } + } + } + } + + if (isNoMod) { + // the folder contains one no-mod object and is named from an attachment point + // => return a special character that will be handled by the calling method + if (nbWorn > 0) return "N"; + else return "n"; + } + else { + if (isRoot || nbItems == 0) res = 0; // forcibly hide all items contained directly under #RLV + else if (nbWorn >= nbItems) res = 3; + else if (nbWorn > 0) res = 2; + else res = 1; + } + std::stringstream str; + str << res; + str << subRes; + res_as_string = str.str(); + return res_as_string; +} + +LLInventoryCategory* RRInterface::getRlvShare () +{ +// BOOL debug = gSavedSettings.getBOOL("RestrainedLifeDebug"); + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + gInventory.getDirectDescendentsOf ( + gInventory.findCategoryUUIDForType(LLAssetType::AT_CATEGORY), cats, items + ); + + if(cats) { + S32 count = cats->count(); + for(S32 i = 0; i < count; ++i) { + LLInventoryCategory* cat = cats->get(i); + std::string name = cat->getName(); + if (name == RR_SHARED_FOLDER) { +// if (debug) { +// llinfos << "found " << name << llendl; +// } + return cat; + } + } + } + return NULL; +} + +BOOL RRInterface::isUnderRlvShare (LLInventoryItem* item) +{ + if (item == NULL) return FALSE; + LLInventoryCategory* res = NULL; + LLInventoryCategory* rlv = getRlvShare(); + if (rlv == NULL) return FALSE; + LLUUID root_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CATEGORY); + + const LLUUID& cat_id = item->getParentUUID(); + res = gInventory.getCategory (cat_id); + + while (res && res->getUUID() != root_id) { + if (res == rlv) return TRUE; + const LLUUID& parent_id = res->getParentUUID(); + res = gInventory.getCategory (parent_id); + } + return FALSE; +} + +void RRInterface::renameAttachment (LLInventoryItem* item, LLViewerJointAttachment* attachment) +{ + // DEPRECATED : done directly in the viewer code + // if item is worn and shared, check its name + // if it doesn't contain the name of attachment, append it + // (but truncate the name first if it's too long) + if (!item || !attachment) return; + LLVOAvatar* avatar = gAgent.getAvatarObject(); + + if( avatar && avatar->isWearingAttachment( item->getUUID() ) ) { + if (isUnderRlvShare (item)) { + LLViewerJointAttachment* attachpt = findAttachmentPointFromName (item->getName()); + if (attachpt == NULL) { + + } + } + } +} + +LLInventoryCategory* RRInterface::getCategoryUnderRlvShare (std::string catName, LLInventoryCategory* root) +{ + if (root == NULL) root = getRlvShare(); + if (catName == "") return root; + LLStringUtil::toLower (catName); + std::deque tokens = parse (catName, "/"); + + // Preliminary action : remove everything after pipes ("|"), including pipes themselves + // This way we can feed the result of a @getinvworn command directly into this method + // without having to clean what is after the pipes + int nb = tokens.size(); + for (int i=0; igetUUID(), cats, items); + + if(cats) { + S32 count = cats->count(); + LLInventoryCategory* cat = NULL; + + // we need to scan first and retain the best match + int max_size_index = -1; + int max_size = 0; + + for(S32 i = 0; i < count; ++i) { + cat = cats->get(i); + std::string name = cat->getName(); + if (name != "" && name[0] != '.') { // ignore invisible folders + LLStringUtil::toLower (name); + + int size = match (tokens, name); + if (size > max_size) { + max_size = size; + max_size_index = i; + } + } + } + + // only now we can grab the best match and either continue deeper or return it + if (max_size > 0) { + cat = cats->get(max_size_index); + if (max_size == tokens.size()) return cat; + else return getCategoryUnderRlvShare ( + dumpList2String ( + getSubList (tokens, max_size) + , "/") + , cat); + } + } + } + + if (gSavedSettings.getBOOL("RestrainedLifeDebug")) { + llinfos << "category not found" << llendl; + } + return NULL; +} + +LLInventoryCategory* RRInterface::findCategoryUnderRlvShare (std::string catName, LLInventoryCategory* root) +{ + if (root == NULL) root = getRlvShare(); + LLStringUtil::toLower (catName); + std::deque tokens = parse (catName, "&&"); + + if (root) { + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + gInventory.getDirectDescendentsOf (root->getUUID(), cats, items); + + if(cats) + { + S32 count = cats->count(); + LLInventoryCategory* cat = NULL; + + for(S32 i = 0; i < count; ++i) + { + cat = cats->get(i); + + // search deeper first + LLInventoryCategory* found = findCategoryUnderRlvShare (catName, cat); + if (found != NULL) return found; + + } + } + // return this category if it matches + std::string name = root->getName(); + LLStringUtil::toLower (name); + // We can't find invisible folders ('.') and dropped folders ('~') + if (name != "" && name[0] != '.' && name[0] != '~' && findMultiple (tokens, name)) return root; + } + // didn't find anything + return NULL; +} + +std::string RRInterface::findAttachmentNameFromPoint (LLViewerJointAttachment* attachpt) +{ + // return the lowercased name of the attachment, or empty if null + if (attachpt == NULL) return ""; + std::string res = attachpt->getName(); + LLStringUtil::toLower(res); + return res; +} + +// This struct is meant to be used in RRInterface::findAttachmentPointFromName below +typedef struct +{ + int length; + int index; + LLViewerJointAttachment* attachment; +} Candidate; + +LLViewerJointAttachment* RRInterface::findAttachmentPointFromName (std::string objectName, BOOL exactName) +{ + BOOL debug = gSavedSettings.getBOOL("RestrainedLifeDebug"); + // for each possible attachment point, check whether its name appears in the name of + // the item. + // We are going to scan the whole list of attachments, but we won't decide which one to take right away. + // Instead, for each matching point, we will store in lists the following results : + // - length of its name + // - right-most index where it is found in the name + // - a pointer to that attachment point + // When we have that list, choose the highest index, and in case of ex-aequo choose the longest length + LLVOAvatar* avatar = gAgent.getAvatarObject(); + if (!avatar) { + llwarns << "NULL avatar pointer. Aborting." << llendl; + return NULL; + } + LLStringUtil::toLower(objectName); + std::string attachName; + int ind = -1; + bool found_one = false; + std::vector candidates; + + for (LLVOAvatar::attachment_map_t::iterator iter = avatar->mAttachmentPoints.begin(); + iter != avatar->mAttachmentPoints.end(); ) + { + LLVOAvatar::attachment_map_t::iterator curiter = iter++; + LLViewerJointAttachment* attachment = curiter->second; + if (attachment) { + attachName = attachment->getName(); + LLStringUtil::toLower(attachName); +// if (debug) { +// llinfos << "trying attachment " << attachName << llendl; +// } + if (exactName && objectName == attachName) return attachment; + else if (!exactName && (ind = objectName.rfind (attachName)) != -1) + { + Candidate new_candidate; + new_candidate.index = ind; + new_candidate.length = attachName.length(); + new_candidate.attachment = attachment; + candidates.push_back (new_candidate); + found_one = true; + if (debug) { + llinfos << "new candidate '" << attachName << "' : index=" << new_candidate.index << " length=" << new_candidate.length << llendl; + } + } + } + } + if (!found_one) { + if (debug) { + llinfos << "no attachment found" << llendl; + } + return NULL; + } + // Now that we have at least one candidate, we have to decide which one to return + LLViewerJointAttachment* res = NULL; + Candidate candidate; + unsigned int i; + int ind_res = -1; + int max_index = -1; + int max_length = -1; + // Find the highest index + for (i=0; i max_index) max_index = candidate.index; + } + // Find the longest match among the ones found at that index + for (i=0; i max_length) { + max_length = candidate.length; + ind_res = i; + } + } + } + // Return this attachment point + if (ind_res > -1) { + candidate = candidates[ind_res]; + res = candidate.attachment; + if (debug && res) { + llinfos << "returning '" << res->getName() << "'" << llendl; + } + } + return res; +} + +LLViewerJointAttachment* RRInterface::findAttachmentPointFromParentName (LLInventoryItem* item) +{ + if (item) { + // => look in parent folder (this could be a no-mod item), use its name to find the target + // attach point + LLViewerInventoryCategory* cat; + const LLUUID& parent_id = item->getParentUUID(); + cat = gInventory.getCategory (parent_id); + return findAttachmentPointFromName (cat->getName()); + } + return NULL; +} + +S32 RRInterface::findAttachmentPointNumber (LLViewerJointAttachment* attachment) +{ + LLVOAvatar* avatar = gAgent.getAvatarObject(); + if (avatar) { + for (LLVOAvatar::attachment_map_t::iterator iter = avatar->mAttachmentPoints.begin(); + iter != avatar->mAttachmentPoints.end(); ++iter) + { + if (iter->second == attachment) { + return iter->first; + } + } + } + return -1; +} + +void RRInterface::fetchInventory (LLInventoryCategory* root) +{ + // do this only once on login + + if (sInventoryFetched) return; + + bool last_step = false; + + if (root == NULL) { + root = getRlvShare(); + last_step = true; + } + + if (root) { + LLViewerInventoryCategory* viewer_root = (LLViewerInventoryCategory*) root; + viewer_root->fetchDescendents (); + + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + + // retrieve all the shared folders + gInventory.getDirectDescendentsOf (viewer_root->getUUID(), cats, items); + if (cats) { + S32 count = cats->count(); + for(S32 i = 0; i < count; ++i) { + LLInventoryCategory* cat = (LLInventoryCategory*)cats->get(i); + fetchInventory (cat); + } + } + + } + + if (last_step) sInventoryFetched = TRUE; +} + +void confirm_replace_attachment_rez(S32 option, void* user_data); + +BOOL RRInterface::forceAttach (std::string category, BOOL recursive /* = FALSE */) +{ + BOOL debug = gSavedSettings.getBOOL("RestrainedLifeDebug"); + // find the category under RLV shared folder + LLInventoryCategory* cat = getCategoryUnderRlvShare (category); + BOOL isRoot = (getRlvShare() == cat); + + // if exists, wear all the items inside it + if (cat) { + + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + + // retrieve all the objects contained in this folder + gInventory.getDirectDescendentsOf (cat->getUUID(), cats, items); + if (items) { + + // wear them one by one + S32 count = items->count(); + for(S32 i = 0; i < count; ++i) { + if (!isRoot) { + LLViewerInventoryItem* item = (LLViewerInventoryItem*)items->get(i); + if (debug) { + llinfos << "trying to attach " << item->getName() << llendl; + } + + // this is an object to attach somewhere + if (item && item->getType() == LLAssetType::AT_OBJECT) { + LLViewerJointAttachment* attachpt = findAttachmentPointFromName (item->getName()); + + if (attachpt) { + if (debug) { + llinfos << "attaching item to " << attachpt->getName() << llendl; + } + // mimick rez_attachment without displaying an Xml alert to confirm + S32 number = findAttachmentPointNumber (attachpt); + if (canAttach(NULL, attachpt->getName())) + { + LLAttachmentRezAction* rez_action = new LLAttachmentRezAction; + rez_action->mItemID = item->getUUID(); + rez_action->mAttachPt = number; + confirm_replace_attachment_rez(0/*YES*/, (void*)rez_action); + } + } + } + // this is a piece of clothing + else if (item->getType() == LLAssetType::AT_CLOTHING + || item->getType() == LLAssetType::AT_BODYPART) { + wear_inventory_item_on_avatar (item); + } + } + } + } + + // scan every subfolder of the folder we are attaching, in order to attach no-mod items + if (cats) { + + // for each subfolder, attach the first item it contains according to its name + S32 count = cats->count(); + for(S32 i = 0; i < count; ++i) { + LLViewerInventoryCategory* cat_child = (LLViewerInventoryCategory*)cats->get(i); + LLViewerJointAttachment* attachpt = findAttachmentPointFromName (cat_child->getName()); + + if (!isRoot) { + if (attachpt) { + // this subfolder is properly named => attach the first item it contains + LLInventoryModel::cat_array_t* cats_grandchildren; // won't be used here + LLInventoryModel::item_array_t* items_grandchildren; // actual no-mod item(s) + gInventory.getDirectDescendentsOf (cat_child->getUUID(), + cats_grandchildren, items_grandchildren); + + if (items_grandchildren && items_grandchildren->count() == 1) { + LLViewerInventoryItem* item_grandchild = + (LLViewerInventoryItem*)items_grandchildren->get(0); + + if (item_grandchild && item_grandchild->getType() == LLAssetType::AT_OBJECT + && !item_grandchild->getPermissions().allowModifyBy(gAgent.getID()) + && findAttachmentPointFromParentName (item_grandchild) != NULL) { // it is no-mod and its parent is named correctly + // we use the attach point from the name of the folder, not the no-mod item + // mimick rez_attachment without displaying an Xml alert to confirm + S32 number = findAttachmentPointNumber (attachpt); + if (canAttach(NULL, attachpt->getName())) + { + LLAttachmentRezAction* rez_action = new LLAttachmentRezAction; + rez_action->mItemID = item_grandchild->getUUID(); + rez_action->mAttachPt = number; + confirm_replace_attachment_rez(0/*YES*/, (void*)rez_action); + } + + } + } + } + } + + if (recursive && cat_child->getName().find (".") != 0) { // attachall and not invisible) + forceAttach (getFullPath (cat_child), recursive); + } + } + } + } + return TRUE; +} + +BOOL RRInterface::forceDetachByName (std::string category, BOOL recursive /* = FALSE */) +{ + BOOL debug = gSavedSettings.getBOOL("RestrainedLifeDebug"); + // find the category under RLV shared folder + LLInventoryCategory* cat = getCategoryUnderRlvShare (category); + LLVOAvatar* avatar = gAgent.getAvatarObject(); + if (!avatar) return FALSE; + BOOL isRoot = (getRlvShare() == cat); + + // if exists, detach/unwear all the items inside it + if (cat) { + + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + + // retrieve all the objects contained in this folder + gInventory.getDirectDescendentsOf (cat->getUUID(), cats, items); + if (items) { + + // unwear them one by one + S32 count = items->count(); + for(S32 i = 0; i < count; ++i) { + if (!isRoot) { + LLViewerInventoryItem* item = (LLViewerInventoryItem*)items->get(i); + if (debug) { + llinfos << "trying to detach " << item->getName() << llendl; + } + + // attached object + if (item->getType() == LLAssetType::AT_OBJECT) { + // find the attachpoint from which to detach + for (LLVOAvatar::attachment_map_t::iterator iter = avatar->mAttachmentPoints.begin(); + iter != avatar->mAttachmentPoints.end(); ) + { + LLVOAvatar::attachment_map_t::iterator curiter = iter++; + LLViewerJointAttachment* attachment = curiter->second; + + if (attachment->getObject()) { + if (attachment->getItemID() == item->getUUID()) { + handle_detach_from_avatar ((void*)attachment); + break; + } + } + } + + } + // piece of clothing + else if (item->getType() == LLAssetType::AT_CLOTHING) { + LLWearable* layer = gAgent.getWearableFromWearableItem (item->getUUID()); + if (layer != NULL) gAgent.removeWearable (layer->getType()); + + } + } + } + } + + if (cats) { + // for each subfolder, detach the first item it contains (only for single no-mod items contained in appropriately named folders) + S32 count = cats->count(); + for(S32 i = 0; i < count; ++i) { + LLViewerInventoryCategory* cat_child = (LLViewerInventoryCategory*)cats->get(i); + LLInventoryModel::cat_array_t* cats_grandchildren; // won't be used here + LLInventoryModel::item_array_t* items_grandchildren; // actual no-mod item(s) + gInventory.getDirectDescendentsOf (cat_child->getUUID(), + cats_grandchildren, items_grandchildren); + + if (!isRoot && items_grandchildren && items_grandchildren->count() == 1) { // only one item + LLViewerInventoryItem* item_grandchild = + (LLViewerInventoryItem*)items_grandchildren->get(0); + + if (item_grandchild && item_grandchild->getType() == LLAssetType::AT_OBJECT + && !item_grandchild->getPermissions().allowModifyBy(gAgent.getID()) + && findAttachmentPointFromParentName (item_grandchild) != NULL) { // and it is no-mod and its parent is named correctly + // detach this object + // find the attachpoint from which to detach + for (LLVOAvatar::attachment_map_t::iterator iter = avatar->mAttachmentPoints.begin(); + iter != avatar->mAttachmentPoints.end(); ) + { + LLVOAvatar::attachment_map_t::iterator curiter = iter++; + LLViewerJointAttachment* attachment = curiter->second; + + if (attachment->getObject()) { + if (attachment->getItemID() == item_grandchild->getUUID()) { + handle_detach_from_avatar ((void*)attachment); + break; + } + } + } + } + } + + if (recursive && cat_child->getName().find (".") != 0) { // detachall and not invisible) + forceDetachByName (getFullPath (cat_child), recursive); + } + } + } + } + return TRUE; +} + +BOOL RRInterface::forceTeleport (std::string location) +{ + BOOL debug = gSavedSettings.getBOOL("RestrainedLifeDebug"); + // location must be X/Y/Z where X, Y and Z are ABSOLUTE coordinates => use a script in-world to translate from local to global + std::string loc (location); + std::string region_name; + S32 x = 128; + S32 y = 128; + S32 z = 0; + std::deque tokens=parse (location, "/"); + if (tokens.size()==3) { + x=atoi (tokens.at(0).c_str()); + y=atoi (tokens.at(1).c_str()); + z=atoi (tokens.at(2).c_str()); + } + else { + return FALSE; + } + + if (debug) { + llinfos << tokens.at(0) << "," << tokens.at(1) << "," << tokens.at(2) << " " << x << "," << y << "," << z << llendl; + } + LLVector3d pos_global; + pos_global.mdV[VX] = (F32)x; + pos_global.mdV[VY] = (F32)y; + pos_global.mdV[VZ] = (F32)z; + + sAllowCancelTp = FALSE; // will be checked once receiving the tp order from the sim, then set to TRUE again + + gAgent.teleportViaLocation (pos_global); + return TRUE; +} + +std::string RRInterface::stringReplace (std::string s, std::string what, std::string by, BOOL caseSensitive /* = FALSE */) +{ +// llinfos << "trying to replace <" << what << "> in <" << s << "> by <" << by << ">" << llendl; + if (what == "" || what == " ") return s; // avoid an infinite loop + int ind; + int old_ind = 0; + int len_what = what.length(); + int len_by = by.length(); + if (len_by == 0) len_by = 1; // avoid an infinite loop + + while ((ind = s.find ("%20")) != -1) // unescape + { + s = s.replace (ind, 3, " "); + } + + std::string lower = s; + if (!caseSensitive) { + LLStringUtil::toLower (lower); + LLStringUtil::toLower (what); + } + + while ((ind = lower.find (what, old_ind)) != -1) + { +// llinfos << "ind=" << ind << " old_ind=" << old_ind << llendl; + s = s.replace (ind, len_what, by); + old_ind = ind + len_by; + lower = s; + if (!caseSensitive) LLStringUtil::toLower (lower); + } + return s; + +} + +std::string RRInterface::getDummyName (std::string name, EChatAudible audible /* = CHAT_AUDIBLE_FULLY */) +{ + int len = name.length(); + if (len < 2) return ""; // just to avoid crashing in some cases + unsigned char hash = name.at(3) + len; // very lame hash function I know... but it should be linear enough (the old length method was way too gaussian with a peak at 11 to 16 characters) + unsigned char mod = hash % 28; + std::string res = ""; + switch (mod) { + case 0: res = "A resident"; break; + case 1: res = "This resident"; break; + case 2: res = "That resident"; break; + case 3: res = "An individual"; break; + case 4: res = "This individual"; break; + case 5: res = "That individual"; break; + case 6: res = "A person"; break; + case 7: res = "This person"; break; + case 8: res = "That person"; break; + case 9: res = "A stranger"; break; + case 10: res = "This stranger"; break; + case 11: res = "That stranger"; break; + case 12: res = "A human being"; break; + case 13: res = "This human being"; break; + case 14: res = "That human being"; break; + case 15: res = "An agent"; break; + case 16: res = "This agent"; break; + case 17: res = "That agent"; break; + case 18: res = "A soul"; break; + case 19: res = "This soul"; break; + case 20: res = "That soul"; break; + case 21: res = "Somebody"; break; + case 22: res = "Some people"; break; + case 23: res = "Someone"; break; + case 24: res = "Mysterious one"; break; + case 25: res = "An unknown being"; break; + case 26: res = "Unidentified one"; break; + default: res = "An unknown person"; break; + } + if (audible == CHAT_AUDIBLE_BARELY) res += " afar"; + return res; +} + +std::string RRInterface::getCensoredMessage (std::string str) +{ + // Hide every occurrence of the name of anybody around (found in cache, so not completely accurate nor completely immediate) + S32 i; + for (i=0; iisAvatar()) { + if (gCacheName->getFullName (object->getID(), name)) { + dummy_name = getDummyName (name); + str = stringReplace (str, + name, dummy_name); // full name first +// str = stringReplace (str, +// getFirstName (name), dummy_name); // first name +// str = stringReplace (str, +// getLastName (name), dummy_name); // last name + } + } + } + } + return str; +} + +void updateAndSave (WLColorControl* color) +{ + if (color == NULL) return; + color->i = color->r; + if (color->g > color->i) { + color->i = color->g; + } + if (color->b > color->i) { + color->i = color->b; + } + color->update (LLWLParamManager::instance()->mCurParams); +} + +void updateAndSave (WLFloatControl* floatControl) +{ + if (floatControl == NULL) return; + floatControl->update (LLWLParamManager::instance()->mCurParams); +} + +BOOL RRInterface::forceEnvironment (std::string command, std::string option) +{ + // command is "setenv_" + double val = atof (option.c_str()); + + int length = 7; // size of "setenv_" + command = command.substr (length); + LLWLParamManager* params = LLWLParamManager::instance(); + + params->mAnimator.mIsRunning = false; + params->mAnimator.mUseLindenTime = false; + + if (command == "daytime") { + if (val > 1.0) val = 1.0; + if (val >= 0.0) { + params->mAnimator.setDayTime(val); + params->mAnimator.update(params->mCurParams); + } + else { + LLWLParamManager::instance()->mAnimator.mIsRunning = true; + LLWLParamManager::instance()->mAnimator.mUseLindenTime = true; + } + } + else if (command == "bluehorizonr") { + params->mBlueHorizon.r = val*2; + updateAndSave (&(params->mBlueHorizon)); + } + else if (command == "bluehorizong") { + params->mBlueHorizon.g = val*2; + updateAndSave (&(params->mBlueHorizon)); + } + else if (command == "bluehorizonb") { + params->mBlueHorizon.b = val*2; + updateAndSave (&(params->mBlueHorizon)); + } + else if (command == "bluehorizoni") { + params->mBlueHorizon.r = val*2; + params->mBlueHorizon.g = val*2; + params->mBlueHorizon.b = val*2; + updateAndSave (&(params->mBlueHorizon)); + } + + else if (command == "bluedensityr") { + params->mBlueDensity.r = val*2; + updateAndSave (&(params->mBlueDensity)); + } + else if (command == "bluedensityg") { + params->mBlueDensity.g = val*2; + updateAndSave (&(params->mBlueDensity)); + } + else if (command == "bluedensityb") { + params->mBlueDensity.b = val*2; + updateAndSave (&(params->mBlueDensity)); + } + else if (command == "bluedensityi") { + params->mBlueDensity.r = val*2; + params->mBlueDensity.g = val*2; + params->mBlueDensity.b = val*2; + updateAndSave (&(params->mBlueDensity)); + } + + else if (command == "hazehorizon") { + params->mHazeHorizon.r = val*2; + params->mHazeHorizon.g = val*2; + params->mHazeHorizon.b = val*2; + updateAndSave (&(params->mHazeHorizon)); + } + else if (command == "hazedensity") { + params->mHazeDensity.r = val*2; + params->mHazeDensity.g = val*2; + params->mHazeDensity.b = val*2; + updateAndSave (&(params->mHazeDensity)); + } + + else if (command == "densitymultiplier") { + params->mDensityMult.x = val/1000; + updateAndSave (&(params->mDensityMult)); +// LLWaterParamManager* water_params = LLWaterParamManager::instance(); +// water_params->mFogDensity.mExp = 5.0; +// water_params->mFogDensity.update (water_params->mCurParams); + } + else if (command == "distancemultiplier") { + params->mDistanceMult.x = val; + updateAndSave (&(params->mDistanceMult)); +// LLWaterParamManager* water_params = LLWaterParamManager::instance(); +// water_params->mUnderWaterFogMod.mX = 1.0; +// water_params->mUnderWaterFogMod.update (water_params->mCurParams); + } + else if (command == "maxaltitude") { + params->mMaxAlt.x = val; + updateAndSave (&(params->mMaxAlt)); + } + + else if (command == "sunmooncolorr") { + params->mSunlight.r = val*3; + updateAndSave (&(params->mSunlight)); + } + else if (command == "sunmooncolorg") { + params->mSunlight.g = val*3; + updateAndSave (&(params->mSunlight)); + } + else if (command == "sunmooncolorb") { + params->mSunlight.b = val*3; + updateAndSave (&(params->mSunlight)); + } + else if (command == "sunmooncolori") { + params->mSunlight.r = val*3; + params->mSunlight.g = val*3; + params->mSunlight.b = val*3; + updateAndSave (&(params->mSunlight)); + } + + else if (command == "ambientr") { + params->mAmbient.r = val*3; + updateAndSave (&(params->mAmbient)); + } + else if (command == "ambientg") { + params->mAmbient.g = val*3; + updateAndSave (&(params->mAmbient)); + } + else if (command == "ambientb") { + params->mAmbient.b = val*3; + updateAndSave (&(params->mAmbient)); + } + else if (command == "ambienti") { + params->mAmbient.r = val*3; + params->mAmbient.g = val*3; + params->mAmbient.b = val*3; + updateAndSave (&(params->mAmbient)); + } + else if (command == "sunglowfocus") { + params->mGlow.b = -val*5; + updateAndSave (&(params->mGlow)); + } + else if (command == "sunglowsize") { + params->mGlow.r = (2-val)*20; + updateAndSave (&(params->mGlow)); + } + else if (command == "scenegamma") { + params->mWLGamma.x = val; + updateAndSave (&(params->mWLGamma)); + } + else if (command == "sunmoonposition") { + params->mCurParams.setSunAngle (F_TWO_PI * val); + } + else if (command == "eastangle") { + params->mCurParams.setEastAngle (F_TWO_PI * val); + } + else if (command == "starbrightness") { + params->mCurParams.setStarBrightness (val); + } + + else if (command == "cloudcolorr") { + params->mCloudColor.r = val; + updateAndSave (&(params->mCloudColor)); + } + else if (command == "cloudcolorg") { + params->mCloudColor.g = val; + updateAndSave (&(params->mCloudColor)); + } + else if (command == "cloudcolorb") { + params->mCloudColor.b = val; + updateAndSave (&(params->mCloudColor)); + } + else if (command == "cloudcolori") { + params->mCloudColor.r = val; + params->mCloudColor.g = val; + params->mCloudColor.b = val; + updateAndSave (&(params->mCloudColor)); + } + + else if (command == "cloudx") { + params->mCloudMain.r = val; + updateAndSave (&(params->mCloudMain)); + } + else if (command == "cloudy") { + params->mCloudMain.g = val; + updateAndSave (&(params->mCloudMain)); + } + else if (command == "cloudd") { + params->mCloudMain.b = val; + updateAndSave (&(params->mCloudMain)); + } + + else if (command == "clouddetailx") { + params->mCloudDetail.r = val; + updateAndSave (&(params->mCloudDetail)); + } + else if (command == "clouddetaily") { + params->mCloudDetail.g = val; + updateAndSave (&(params->mCloudDetail)); + } + else if (command == "clouddetaild") { + params->mCloudDetail.b = val; + updateAndSave (&(params->mCloudDetail)); + } + + else if (command == "cloudcoverage") { + params->mCloudCoverage.x = val; + updateAndSave (&(params->mCloudCoverage)); + } + else if (command == "cloudscale") { + params->mCloudScale.x = val; + updateAndSave (&(params->mCloudScale)); + } + + else if (command == "cloudscrollx") { + params->mCurParams.setCloudScrollX (val+10); + } + else if (command == "cloudscrolly") { + params->mCurParams.setCloudScrollY (val+10); + } + // sunglowfocus 0-0.5, sunglowsize 0-2, scenegamma 0-10, starbrightness 0-2 + // cloudcolor rgb 0-1, cloudxydensity xyd 0-1, cloudcoverage 0-1, cloudscale 0-1, clouddetail xyd 0-1 + // cloudscrollx 0-1, cloudscrolly 0-1, drawclassicclouds 0/1 + + else if (command == "preset") { + params->loadPreset (option); + } + + // send the current parameters to shaders + LLWLParamManager::instance()->propagateParameters(); + + return TRUE; +} + +std::string RRInterface::getEnvironment (std::string command) +{ + F64 res = 0; + int length = 7; // size of "getenv_" + command = command.substr (length); + LLWLParamManager* params = LLWLParamManager::instance(); + + if (command == "daytime") { + if (params->mAnimator.mIsRunning && params->mAnimator.mUseLindenTime) res = -1; + else res = params->mAnimator.getDayTime(); + } + + else if (command == "bluehorizonr") res = params->mBlueHorizon.r/2; + else if (command == "bluehorizong") res = params->mBlueHorizon.g/2; + else if (command == "bluehorizonb") res = params->mBlueHorizon.b/2; + else if (command == "bluehorizoni") res = max (max (params->mBlueHorizon.r, params->mBlueHorizon.g), params->mBlueHorizon.b) / 2; + + else if (command == "bluedensityr") res = params->mBlueDensity.r/2; + else if (command == "bluedensityg") res = params->mBlueDensity.g/2; + else if (command == "bluedensityb") res = params->mBlueDensity.b/2; + else if (command == "bluedensityi") res = max (max (params->mBlueDensity.r, params->mBlueDensity.g), params->mBlueDensity.b) / 2; + + else if (command == "hazehorizon") res = max (max (params->mHazeHorizon.r, params->mHazeHorizon.g), params->mHazeHorizon.b) / 2; + else if (command == "hazedensity") res = max (max (params->mHazeDensity.r, params->mHazeDensity.g), params->mHazeDensity.b) / 2; + + else if (command == "densitymultiplier") res = params->mDensityMult.x*1000; + else if (command == "distancemultiplier") res = params->mDistanceMult.x; + else if (command == "maxaltitude") res = params->mMaxAlt.x; + + else if (command == "sunmooncolorr") res = params->mSunlight.r/3; + else if (command == "sunmooncolorg") res = params->mSunlight.g/3; + else if (command == "sunmooncolorb") res = params->mSunlight.b/3; + else if (command == "sunmooncolori") res = max (max (params->mSunlight.r, params->mSunlight.g), params->mSunlight.b) / 3; + + else if (command == "ambientr") res = params->mAmbient.r/3; + else if (command == "ambientg") res = params->mAmbient.g/3; + else if (command == "ambientb") res = params->mAmbient.b/3; + else if (command == "ambienti") res = max (max (params->mAmbient.r, params->mAmbient.g), params->mAmbient.b) / 3; + + else if (command == "sunglowfocus") res = -params->mGlow.b/5; + else if (command == "sunglowsize") res = 2-params->mGlow.r/20; + else if (command == "scenegamma") res = params->mWLGamma.x; + + else if (command == "sunmoonposition") res = params->mCurParams.getSunAngle()/F_TWO_PI; + else if (command == "eastangle") res = params->mCurParams.getEastAngle()/F_TWO_PI; + else if (command == "starbrightness") res = params->mCurParams.getStarBrightness(); + + else if (command == "cloudcolorr") res = params->mCloudColor.r; + else if (command == "cloudcolorg") res = params->mCloudColor.g; + else if (command == "cloudcolorb") res = params->mCloudColor.b; + else if (command == "cloudcolori") res = max (max (params->mCloudColor.r, params->mCloudColor.g), params->mCloudColor.b); + + else if (command == "cloudx") res = params->mCloudMain.r; + else if (command == "cloudy") res = params->mCloudMain.g; + else if (command == "cloudd") res = params->mCloudMain.b; + + else if (command == "clouddetailx") res = params->mCloudDetail.r; + else if (command == "clouddetaily") res = params->mCloudDetail.g; + else if (command == "clouddetaild") res = params->mCloudDetail.b; + + else if (command == "cloudcoverage") res = params->mCloudCoverage.x; + else if (command == "cloudscale") res = params->mCloudScale.x; + + else if (command == "cloudscrollx") res = params->mCurParams.getCloudScrollX() - 10; + else if (command == "cloudscrolly") res = params->mCurParams.getCloudScrollY() - 10; + + else if (command == "preset") return getLastLoadedPreset(); + + std::stringstream str; + str << res; + return str.str(); +} + +BOOL RRInterface::forceDebugSetting (std::string command, std::string option) +{ + // MK: As some debug settings are critical to the user's experience and others + // are just useless/not used, we are following a whitelist approach : only allow + // certain debug settings to be changed and not all. + + // command is "setdebug_" + + int length = 9; // size of "setdebug_" + command = command.substr (length); + LLStringUtil::toLower(command); + std::string allowed; + std::string tmp; + int ind; + + allowed = sAllowedU32; + tmp = allowed; + LLStringUtil::toLower(tmp); + if ((ind = tmp.find (","+command+",")) != -1) { + gSavedSettings.setU32 (allowed.substr(++ind, command.length()), atoi(option.c_str())); + return TRUE; + } + + return TRUE; +} + +std::string RRInterface::getDebugSetting (std::string command) +{ + std::stringstream res; + int length = 9; // size of "getdebug_" + command = command.substr (length); + LLStringUtil::toLower(command); + std::string allowed; + std::string tmp; + int ind; + + allowed = sAllowedU32; + tmp = allowed; + LLStringUtil::toLower(tmp); + if ((ind = tmp.find (","+command+",")) != -1) { + res << gSavedSettings.getU32 (allowed.substr(++ind, command.length())); + } + + return res.str(); +} + +std::string RRInterface::getFullPath (LLInventoryCategory* cat) +{ + if (cat == NULL) return ""; + LLInventoryCategory* rlv = gAgent.mRRInterface.getRlvShare(); + if (rlv == NULL) return ""; + LLInventoryCategory* res = cat; + std::deque tokens; + + while (res && res != rlv) { + tokens.push_front (res->getName()); + const LLUUID& parent_id = res->getParentUUID(); + res = gInventory.getCategory (parent_id); + } + return dumpList2String (tokens, "/"); +} + +std::string RRInterface::getFullPath (LLInventoryItem* item, std::string option) +{ + // Returns the path from the shared root to this object, or to the object worn at the attach point or clothing layer pointed by option if any + if (option != "") { + item = NULL; // an option is specified => we don't want to check the item that issued the command, but something else that is currently worn (object or clothing) + + EWearableType wearable_type = gAgent.mRRInterface.getOutfitLayerAsType (option); + if (wearable_type != WT_INVALID) { // this is a clothing layer => replace item with the piece clothing + LLUUID id = gAgent.getWearableItem (wearable_type); + if (id.notNull()) item = gInventory.getItem(id); + if (item != NULL && !gAgent.mRRInterface.isUnderRlvShare(item)) item = NULL; // security : we would return the path even if the item was not shared otherwise + } + else { // this is not a clothing layer => it has to be an attachment point + LLViewerJointAttachment* attach_point = gAgent.mRRInterface.findAttachmentPointFromName (option, TRUE); + if (attach_point) { + LLViewerObject* attached_object = attach_point->getObject(); + item = getItemAux (attached_object, gAgent.mRRInterface.getRlvShare()); + if (item != NULL && !gAgent.mRRInterface.isUnderRlvShare(item)) item = NULL; // security : we would return the path even if the item was not shared otherwise + } + } + } + + if (item != NULL && !gAgent.mRRInterface.isUnderRlvShare(item)) item = NULL; // security : we would return the path even if the item was not shared otherwise + if (item == NULL) return ""; + LLUUID parent_id = item->getParentUUID(); + LLInventoryCategory* parent_cat = gInventory.getCategory (parent_id); + + if (item->getType() == LLAssetType::AT_OBJECT && !item->getPermissions().allowModifyBy(gAgent.getID())) { + if (gAgent.mRRInterface.findAttachmentPointFromName(parent_cat->getName()) != NULL) { + // this item is no-mod and its parent folder contains the name of an attach point + // => probably we want the full path only to the containing folder of that folder + parent_id = parent_cat->getParentUUID(); + parent_cat = gInventory.getCategory (parent_id); + return getFullPath (parent_cat); + } + } + + return getFullPath (parent_cat); +} + + +LLInventoryItem* RRInterface::getItemAux (LLViewerObject* attached_object, LLInventoryCategory* root) +{ + // auxiliary function for getItem() + if (!attached_object) return NULL; + LLVOAvatar* avatar = gAgent.getAvatarObject(); + if (root && avatar) { + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + gInventory.getDirectDescendentsOf (root->getUUID(), cats, items); + S32 count; + S32 i; + LLInventoryItem* item = NULL; + LLInventoryCategory* cat = NULL; + + // Try to find the item in the current category + count = items->count(); + for(i = 0; i < count; ++i) { + item = items->get(i); + if (item + && (item->getType() == LLAssetType::AT_OBJECT || item->getType() == LLAssetType::AT_CLOTHING) + && avatar->getWornAttachment (item->getUUID()) == attached_object + ) { + // found the item in the current category + return item; + } + } + + // We didn't find it here => browse the children categories + count = cats->count(); + for(i = 0; i < count; ++i) { + cat = cats->get(i); + item = getItemAux (attached_object, cat); + if (item != NULL) return item; + } + } + // We didn't find it (this should not happen) + return NULL; +} + +LLInventoryItem* RRInterface::getItem (LLUUID wornObjectUuidInWorld) +{ + // return the inventory item corresponding to the viewer object which UUID is "wornObjectUuidInWorld", if any + LLViewerObject* object = gObjectList.findObject (wornObjectUuidInWorld); + if (object != NULL) { + object = object->getRootEdit(); + if (object->isAttachment()) { + return getItemAux (object, gInventory.getCategory(gInventory.findCategoryUUIDForType(LLAssetType::AT_CATEGORY))); //gAgent.mRRInterface.getRlvShare()); + } + } + // This object is not worn => it has nothing to do with any inventory item + return NULL; +} + +void RRInterface::attachObjectByUUID (LLUUID assetUUID, int attachPtNumber) +{ + // caution : this method does NOT check that the target attach point is already used by a locked item + LLAttachmentRezAction* rez_action = new LLAttachmentRezAction; + rez_action->mItemID = assetUUID; + rez_action->mAttachPt = attachPtNumber; + confirm_replace_attachment_rez(0/*YES*/, (void*)rez_action); +} + +bool RRInterface::canDetachAllSelectedObjects () +{ + for (LLObjectSelection::iterator iter = LLSelectMgr::getInstance()->getSelection()->begin(); + iter != LLSelectMgr::getInstance()->getSelection()->end(); ) + { + LLObjectSelection::iterator curiter = iter++; + LLViewerObject* object = (*curiter)->getObject(); + if (object && !canDetach(object)) + { + return false; + } + } + return true; +} + +bool RRInterface::isSittingOnAnySelectedObject() +{ + if (gAgent.getAvatarObject() && !gAgent.getAvatarObject()->mIsSitting) { + return false; + } + + for (LLObjectSelection::iterator iter = LLSelectMgr::getInstance()->getSelection()->begin(); + iter != LLSelectMgr::getInstance()->getSelection()->end(); ) + { + LLObjectSelection::iterator curiter = iter++; + LLViewerObject* object = (*curiter)->getObject(); + if (object && object->isSeat()) + { + return true; + } + } + return false; +} + +bool RRInterface::canDetach(LLViewerObject* attached_object) +{ + if (attached_object == NULL) return true; + if (attached_object->getRootEdit() == NULL) return true; + + if (!isAllowed (attached_object->getRootEdit()->getID(), "detach", FALSE)) return false; + + LLVOAvatar* avatarp = gAgent.getAvatarObject(); + if (avatarp) { + LLInventoryItem* inv_item = getItem(attached_object->getRootEdit()->getID()); + if (inv_item) { + std::string attachpt = avatarp->getAttachedPointName(inv_item->getUUID()); + if (!canDetach(attachpt)) return false; + } + } + return true; +} + +bool RRInterface::canDetach(std::string attachpt) +{ + LLStringUtil::toLower(attachpt); + if (contains("detach:"+attachpt)) return false; + if (contains("remattach")) return false; + if (contains("remattach:"+attachpt)) return false; + return true; +} + +bool RRInterface::canAttach(LLViewerObject* object_to_attach, std::string attachpt) +{ + LLStringUtil::toLower(attachpt); + if (contains("detach:"+attachpt)) return false; + if (contains("addattach")) return false; + if (contains("addattach:"+attachpt)) return false; + + LLViewerJointAttachment* attachment = findAttachmentPointFromName(attachpt, TRUE); + if (attachment && object_to_attach != attachment->getObject()) { + if (!canDetach(attachment->getObject())) return false; + } + return true; +} diff --git a/linden/indra/newview/RRInterface.h b/linden/indra/newview/RRInterface.h new file mode 100644 index 0000000..5bf5f05 --- /dev/null +++ b/linden/indra/newview/RRInterface.h @@ -0,0 +1,202 @@ +#ifndef LL_RRINTERFACE_H +#define LL_RRINTERFACE_H + +#define RR_VIEWER_NAME "RestrainedLife" +#define RR_VERSION_NUM "1220102" +#define RR_VERSION "1.22.1" +#define RR_SLV_VERSION "1.22.12.0" + +#define RR_PREFIX "@" +#define RR_SHARED_FOLDER "#RLV" +#define RR_RLV_REDIR_FOLDER_PREFIX "#RLV/~" +// Length of the "#RLV/" string constant in characters. +#define RR_HRLVS_LENGTH 5 + +// wearable types as strings +#define WS_ALL "all" +#define WS_EYES "eyes" +#define WS_SKIN "skin" +#define WS_SHAPE "shape" +#define WS_HAIR "hair" +#define WS_GLOVES "gloves" +#define WS_JACKET "jacket" +#define WS_PANTS "pants" +#define WS_SHIRT "shirt" +#define WS_SHOES "shoes" +#define WS_SKIRT "skirt" +#define WS_SOCKS "socks" +#define WS_UNDERPANTS "underpants" +#define WS_UNDERSHIRT "undershirt" + + +//#include +#include +#include +#include + +#include "lluuid.h" +#include "llchat.h" +#include "llchatbar.h" +#include "llinventorymodel.h" +#include "llviewermenu.h" +#include "llwearable.h" + +typedef std::multimap RRMAP; +typedef struct Command { + LLUUID uuid; + std::string command; +} Command; + +typedef struct AssetAndTarget { + LLUUID uuid; + std::string attachpt; +} AssetAndTarget; + +class RRInterface +{ +public: + + RRInterface (); + ~RRInterface (); + + std::string getVersion (); + BOOL isAllowed (LLUUID object_uuid, std::string action, BOOL log_it = TRUE); + BOOL contains (std::string action); // return TRUE if the action is contained + BOOL containsSubstr (std::string action); + BOOL containsWithoutException (std::string action, std::string except = ""); // return TRUE if the action or action+"_sec" is contained, and either there is no global exception, or there is no local exception if we found action+"_sec" + + BOOL add (LLUUID object_uuid, std::string action, std::string option); + BOOL remove (LLUUID object_uuid, std::string action, std::string option); + BOOL clear (LLUUID object_uuid, std::string command=""); + void replace (LLUUID what, LLUUID by); + BOOL garbageCollector (BOOL all=TRUE); // if false, don't clear rules attached to NULL_KEY as they are issued from external objects (only cleared when changing parcel) + std::deque parse (std::string str, std::string sep); // utility function + void notify (LLUUID object_uuid, std::string action, std::string suffix); // scan the list of restrictions, when finding "notify" say the action on the specified channel + + BOOL parseCommand (std::string command, std::string& behaviour, std::string& option, std::string& param); + BOOL handleCommand (LLUUID uuid, std::string command); + BOOL fireCommands (); // execute commands buffered while the viewer was initializing (mostly useful for force-sit as when the command is sent the object is not necessarily rezzed yet) + BOOL force (LLUUID object_uuid, std::string command, std::string option); + + BOOL answerOnChat (std::string channel, std::string msg); + std::string crunchEmote (std::string msg, unsigned int truncateTo); + + std::string getOutfitLayerAsString (EWearableType layer); + EWearableType getOutfitLayerAsType (std::string layer); + std::string getOutfit (std::string layer); + std::string getAttachments (std::string attachpt); + + std::string getStatus (LLUUID object_uuid, std::string rule); // if object_uuid is null, return all + BOOL forceDetach (std::string attachpt); + BOOL forceDetachByUuid (std::string object_uuid); + + BOOL hasLockedHuds (); + std::deque getListOfLockedItems (LLInventoryCategory* root); + std::string getInventoryList (std::string path, BOOL withWornInfo = FALSE); + std::string getWornItems (LLInventoryCategory* cat); + LLInventoryCategory* getRlvShare (); // return pointer to #RLV folder or null if does not exist + BOOL isUnderRlvShare (LLInventoryItem* item); + void renameAttachment (LLInventoryItem* item, LLViewerJointAttachment* attachment); // DEPRECATED + LLInventoryCategory* getCategoryUnderRlvShare (std::string catName, LLInventoryCategory* root = NULL); + LLInventoryCategory* findCategoryUnderRlvShare (std::string catName, LLInventoryCategory* root = NULL); + std::string findAttachmentNameFromPoint (LLViewerJointAttachment* attachpt); + LLViewerJointAttachment* findAttachmentPointFromName (std::string objectName, BOOL exactName = FALSE); + LLViewerJointAttachment* findAttachmentPointFromParentName (LLInventoryItem* item); + S32 findAttachmentPointNumber (LLViewerJointAttachment* attachment); + void fetchInventory (LLInventoryCategory* root = NULL); + + BOOL forceAttach (std::string category, BOOL recursive = FALSE); + BOOL forceDetachByName (std::string category, BOOL recursive = FALSE); + + BOOL getAllowCancelTp() { return sAllowCancelTp; } + void setAllowCancelTp(BOOL newval) { sAllowCancelTp = newval; } + + std::string getParcelName () { return sParcelName; } + void setParcelName (std::string newval) { sParcelName = newval; } + + BOOL forceTeleport (std::string location); + + std::string stringReplace (std::string s, std::string what, std::string by, BOOL caseSensitive = FALSE); + + std::string getDummyName (std::string name, EChatAudible audible = CHAT_AUDIBLE_FULLY); // return "someone", "unknown" etc according to the length of the name (when shownames is on) + std::string getCensoredMessage (std::string str); // replace names by dummy names + + LLUUID getSitTargetId () { return sSitTargetId; } + void setSitTargetId (LLUUID newval) { sSitTargetId = newval; } + + BOOL forceEnvironment (std::string command, std::string option); // command is "setenv_", option is a list of floats (separated by "/") + std::string getEnvironment (std::string command); // command is "getenv_" + + std::string getLastLoadedPreset () { return sLastLoadedPreset; } + void setLastLoadedPreset (std::string newval) { sLastLoadedPreset = newval; } + + BOOL forceDebugSetting (std::string command, std::string option); // command is "setdebug_", option is a list of values (separated by "/") + std::string getDebugSetting (std::string command); // command is "getdebug_" + + std::string getFullPath (LLInventoryCategory* cat); + std::string getFullPath (LLInventoryItem* item, std::string option = ""); + LLInventoryItem* getItemAux (LLViewerObject* attached_object, LLInventoryCategory* root); + LLInventoryItem* getItem (LLUUID wornObjectUuidInWorld); + void attachObjectByUUID (LLUUID assetUUID, int attachPtNumber = 0); + + bool canDetachAllSelectedObjects(); + bool isSittingOnAnySelectedObject(); + + bool canDetach(LLViewerObject* attached_object); + bool canDetach(std::string attachpt); + bool canAttach(LLViewerObject* object_to_attach, std::string attachpt); + + // Some cache variables to accelerate common checks + BOOL mHasLockedHuds; + BOOL mContainsDetach; + BOOL mContainsShowinv; + BOOL mContainsUnsit; + BOOL mContainsFartouch; + BOOL mContainsShowworldmap; + BOOL mContainsShowminimap; + BOOL mContainsShowloc; + BOOL mContainsShownames; + BOOL mContainsSetenv; + BOOL mContainsFly; + BOOL mContainsEdit; + BOOL mContainsRez; + BOOL mContainsShowhovertextall; + BOOL mContainsShowhovertexthud; + BOOL mContainsShowhovertextworld; + BOOL mContainsDefaultwear; + BOOL mContainsPermissive; + + // Allowed debug settings (initialized in the ctor) + std::string sAllowedU32; + std::string sAllowedS32; + std::string sAllowedF32; + std::string sAllowedBOOLEAN; + std::string sAllowedSTRING; + std::string sAllowedVEC3; + std::string sAllowedVEC3D; + std::string sAllowedRECT; + std::string sAllowedCOL4; + std::string sAllowedCOL3; + std::string sAllowedCOL4U; + + // These should be private but we may want to browse them from the outside world, so let's keep them public + RRMAP sSpecialObjectBehaviours; + std::deque sRetainedCommands; + + // When a locked attachment is kicked off by another one with llAttachToAvatar() in a script, retain its UUID here, to reattach it later + std::deque sAssetsToReattach; + int sTimeBeforeReattaching; + AssetAndTarget sJustDetached; // we need this to inhibit the removeObject event that occurs right after addObject in the case of a replacement + AssetAndTarget sJustReattached; // we need this to inhibit the removeObject event that occurs right after addObject in the case of a replacement + +private: + std::string sParcelName; // for convenience (gAgent does not retain the name of the current parcel) + BOOL sInventoryFetched; // FALSE at first, used to fetch RL Share inventory once upon login + BOOL sAllowCancelTp; // TRUE unless forced to TP with @tpto (=> receive TP order from server, act like it is a lure from a Linden => don't show the cancel button) + LLUUID sSitTargetId; + std::string sLastLoadedPreset; // contains the name of the latest loaded Windlight preset + +}; + + +#endif diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml index 7b178d6..e12c235 100644 --- a/linden/indra/newview/app_settings/settings.xml +++ b/linden/indra/newview/app_settings/settings.xml @@ -1105,6 +1105,17 @@ Value 0 + DisableMessagesSpacing + + Comment + Set to TRUE to disable messages spacing in chat console + Persist + 1 + Type + Boolean + Value + 1 + ChatFullWidth Comment @@ -1125,7 +1136,7 @@ Type Boolean Value - 0 + 1 ChatOnlineNotification @@ -1892,7 +1903,7 @@ Type F32 Value - 0.700 + 0.400 ConsoleBufferSize @@ -1916,17 +1927,6 @@ Value 40 - ContactsTornOff - - Comment - Show contacts window separately from Communicate window. - Persist - 1 - Type - Boolean - Value - 0 - CookiesEnabled Comment @@ -2973,6 +2973,22 @@ 0 + FloaterGroupsRect + + Comment + Rectangle for groups window" + Persist + 1 + Type + Rect + Value + + 0 + 300 + 275 + 0 + + FloaterGestureRect2 Comment @@ -6918,6 +6934,61 @@ Value 0 + RestrainedLife + + Comment + Toggles the RestrainedLife features (BDSM lockable toys support). Needs a restart of the viewer. + Persist + 1 + Type + Boolean + Value + 0 + + RestrainedLifeDebug + + Comment + Toggles the RestrainedLife debug mode (displays the commands when in debug mode). + Persist + 1 + Type + Boolean + Value + 0 + + RestrainedLifeNoSetEnv + + Comment + When TRUE, forbids to set the environment (time of day and Windlight settings) via RestrainedLife. Needs a restart of the viewer. + Persist + 1 + Type + Boolean + Value + 0 + + RestrainedLifeForbidGiveToRLV + + Comment + When TRUE, forbids to give sub-folders to the #RLV RestrainedLife folder. + Persist + 1 + Type + Boolean + Value + 0 + + RestrainedLifeAllowWear + + Comment + When TRUE, enables the Wear command in the inventory context menus (unless @defaultwear is in force). + Persist + 1 + Type + Boolean + Value + 0 + RotateRight Comment @@ -8441,7 +8512,7 @@ Type Boolean Value - 1 + 0 UIFloaterTestBool @@ -10902,5 +10973,82 @@ Value 0 + HideMasterRemote + + Comment + Hide the Master Remote control when useless + Persist + 1 + Type + Boolean + Value + 1 + + ShowGroupsButton + + Comment + Show the Groups button in the toolbar (requires a restart) + Persist + 1 + Type + Boolean + Value + 1 + + UseOldChatHistory + + Comment + Use the old style 'Chat history' window instead of the new 'Local chat' window (requires a restart). + Persist + 1 + Type + Boolean + Value + 1 + + UseOldStatusBarIcons + + Comment + Use the old style, more readable icons in the status bar (requires a restart). + Persist + 1 + Type + Boolean + Value + 1 + + ShowFriends + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + ShowGroups + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + ShowAudioVolume + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + diff --git a/linden/indra/newview/installers/autoit/nrc_install.au3 b/linden/indra/newview/installers/autoit/nrc_install.au3 new file mode 100644 index 0000000..ae47c18 --- /dev/null +++ b/linden/indra/newview/installers/autoit/nrc_install.au3 @@ -0,0 +1,57 @@ +; Installer for non-redistributable components (nrc). Searches locally for an existing viewer +; installation, checks version and size and copies the files into the the Rainbow Viewer directory. +; All credits for this small installer to the Greenlife Emerald guys! +; Needs to be compiled with AutoIt v3, http://www.autoitscript.com +#NoTrayIcon +#RequireAdmin +$LLKDU = "" +$SLVOICE = "" +$FOUND = "" +$SLDIR = RegRead("HKLM\SOFTWARE\Linden Research, Inc.\SecondLife", "") +CHECKFILES() +$SLDIR = RegRead("HKLM\SOFTWARE\Linden Research, Inc.\SecondLifeReleaseCandidate", "") +CHECKFILES() +$SLDIR = RegRead("HKLM\SOFTWARE\CoolViewer\CoolViewer", "") +CHECKFILES() +$SLDIR = RegRead("HKLM\SOFTWARE\RainbowViewer\RainbowViewer", "") +CHECKFILES() +$SLDIR = RegRead("HKLM\SOFTWARE\ModularSystems.sl\GreenLife Emerald Viewer", "") +CHECKFILES() +If $LLKDU <> "" Then + $FOUND &= "KDU " +EndIf +If $SLVOICE <> "" Then + $FOUND &= "SLVoice " +EndIf +If $FOUND <> "" Then + $RESULT = MsgBox(292, "Non-redistributable SecondLife Files", "The following non-redistributable SL components were found"&@CRLF&"on your system from an existing viewer installation and can"&@CRLF&"be automatically installed into Rainbow Viewer:"&@CRLF&@CRLF&$FOUND&@CRLF&@CRLF&"That is recommended for optimum graphics performance and full"&@CRLF&"functionality including voice features."&@CRLF&@CRLF&"Do you want to continue and copy these files?") + If $RESULT = 6 Then + If $LLKDU <> "" Then + FileCopy($LLKDU, @ScriptDir, 1) + EndIf + If $SLVOICE <> "" Then + FileCopy($SLVOICE & "\SLVoice.exe", @ScriptDir, 1) + FileCopy($SLVOICE & "\vivoxsdk.dll", @ScriptDir, 1) + EndIf + EndIf +Else + MsgBox(64, "Non-redistributable SecondLife Files", "No non-redistributable SL components could be found on your system. For optimum performance please install them manually as described in README_IMPORTANT!!!.txt") +EndIf + +Func CHECKFILES() + Local $VER + Local $LEN + If $LLKDU = "" Then + $LEN = FileGetSize($SLDIR & "\llkdu.dll") + If $LEN = 753664 Then + $LLKDU = $SLDIR & "\llkdu.dll" + EndIf + EndIf + If $SLVOICE = "" Then + $VER = FileGetVersion($SLDIR & "\vivoxsdk.dll") + $LEN1 = FileGetSize($SLDIR & "\SLVoice.exe") + If $VER = "2.1.3010.6151" And $LEN1 = 946176 Then + $SLVOICE = $SLDIR + EndIf + EndIf +EndFunc \ No newline at end of file diff --git a/linden/indra/newview/installers/autoit/nrc_install.ico b/linden/indra/newview/installers/autoit/nrc_install.ico new file mode 100644 index 0000000000000000000000000000000000000000..f402bd2678039cb5bf0abe124f1307052aed4116 GIT binary patch literal 9662 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 S8^0iK3^j52zhj)G-v0m~_e^I1 literal 0 HcmV?d00001 diff --git a/linden/indra/newview/installers/windows/install_icon.BMP b/linden/indra/newview/installers/windows/install_icon.BMP index 70d1e330d9d8af2513bae5fad5b223b843850ba3..179cf823e1127802ca6d9185bcf0f2707d3912c2 100644 GIT binary patch literal 262200 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 z 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 diff --git a/linden/indra/newview/installers/windows/install_icon.ico b/linden/indra/newview/installers/windows/install_icon.ico index 712e3d8cccc7a664bcdeb97680263bb22d2a932a..f5d85d8ecc9ec7f040ab7a5db9d4056d21f8223e 100644 GIT binary patch literal 363246 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 L`fS-GklhiZCajAHvDC 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 J8<{jlq(1_+fN%f+ literal 363246 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

    J4=#&r`KWn0Pz1Q^MK||0J8uGee?n= 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\RainbowViewer -; Delete files in Documents and Settings\All Users\RainbowViewer +; Delete files in Documents and Settings\\CoolViewer +; Delete files in Documents and Settings\All Users\CoolViewer ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function un.DocumentsAndSettingsFolder -; Delete files in Documents and Settings\\RainbowViewer +; Delete files in Documents and Settings\\CoolViewer Push $0 Push $1 Push $2 @@ -298,11 +298,11 @@ Push $2 ; Otherwise (preview/dmz etc) just remove cache StrCmp $INSTFLAGS "" RM_ALL RM_CACHE RM_ALL: - RMDir /r "$2\Application Data\RainbowViewer" + RMDir /r "$2\Application Data\CoolViewer" GoTo CONTINUE RM_CACHE: - RMDir /r "$2\Application Data\RainbowViewer\Cache" - Delete "$2\Application Data\RainbowViewer\user_settings\settings_windlight.xml" + RMDir /r "$2\Application Data\CoolViewer\Cache" + Delete "$2\Application Data\CoolViewer\user_settings\settings_windlight.xml" CONTINUE: IntOp $0 $0 + 1 @@ -313,17 +313,17 @@ Pop $2 Pop $1 Pop $0 -; Delete files in Documents and Settings\All Users\RainbowViewer +; Delete files in Documents and Settings\All Users\CoolViewer Push $0 ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData" StrCmp $0 "" +2 - RMDir /r "$0\RainbowViewer" + RMDir /r "$0\CoolViewer" Pop $0 -; Delete filse in C:\Windows\Application Data\RainbowViewer +; Delete filse in C:\Windows\Application Data\CoolViewer ; If the user is running on a pre-NT system, Application Data lives here instead of ; in Documents and Settings. -RMDir /r "$WINDIR\Application Data\RainbowViewer" +RMDir /r "$WINDIR\Application Data\CoolViewer" FunctionEnd @@ -331,17 +331,17 @@ FunctionEnd ; Close the program, if running. Modifies no variables. ; Allows user to bail out of uninstall process. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Function un.CloseRainbowViewer +Function un.CloseCoolViewer Push $0 FindWindow $0 "Second Life" "" IntCmp $0 0 DONE - MessageBox MB_OKCANCEL $(CloseRainbowViewerUnInstMB) IDOK CLOSE IDCANCEL CANCEL_UNINSTALL + MessageBox MB_OKCANCEL $(CloseCoolViewerUnInstMB) IDOK CLOSE IDCANCEL CANCEL_UNINSTALL CANCEL_UNINSTALL: Quit CLOSE: - DetailPrint $(CloseRainbowViewerUnInstDP) + DetailPrint $(CloseCoolViewerUnInstDP) SendMessage $0 16 0 0 LOOP: @@ -363,10 +363,10 @@ FunctionEnd ; Function un.RemovePassword -DetailPrint "Removing Rainbow Viewer password" +DetailPrint "Removing Cool Viewer password" SetShellVarContext current -Delete "$APPDATA\RainbowViewer\user_settings\password.dat" +Delete "$APPDATA\CoolViewer\user_settings\password.dat" SetShellVarContext all FunctionEnd @@ -393,8 +393,8 @@ Delete "$INSTDIR\dronesettings.ini" Delete "$INSTDIR\message_template.msg" Delete "$INSTDIR\newview.pdb" Delete "$INSTDIR\newview.map" -Delete "$INSTDIR\RainbowViewer.pdb" -Delete "$INSTDIR\RainbowViewer.map" +Delete "$INSTDIR\CoolViewer.pdb" +Delete "$INSTDIR\CoolViewer.map" Delete "$INSTDIR\comm.dat" Delete "$INSTDIR\*.glsl" Delete "$INSTDIR\motions\*.lla" @@ -447,10 +447,10 @@ Call un.CheckIfAdministrator ; Make sure the user can install/uninstall SetShellVarContext all ; Make sure we're not running -Call un.CloseRainbowViewer +Call un.CloseCoolViewer ; Clean up registry keys and subkeys (these should all be !defines somewhere) -DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\RainbowViewer\$INSTPROG" +DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\CoolViewer\$INSTPROG" DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" ; Clean up shortcuts @@ -587,7 +587,7 @@ lbl_check_silent: ; If we currently have a version of SL installed, default to the language of that install ; Otherwise don't change $LANGUAGE and it will default to the OS UI language. - ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\RainbowViewer\${INSTNAME}" "InstallerLanguage" + ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\CoolViewer\${INSTNAME}" "InstallerLanguage" IfErrors lbl_build_menu StrCpy $LANGUAGE $0 @@ -605,7 +605,7 @@ lbl_build_menu: StrCpy $LANGUAGE $0 ; save language in registry - WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\RainbowViewer\${INSTNAME}" "InstallerLanguage" $LANGUAGE + WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\CoolViewer\${INSTNAME}" "InstallerLanguage" $LANGUAGE lbl_return: Pop $0 Return @@ -615,7 +615,7 @@ FunctionEnd Function un.onInit ; read language from registry and set for uninstaller ; Key will be removed on successful uninstall - ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\RainbowViewer\${INSTNAME}" "InstallerLanguage" + ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\CoolViewer\${INSTNAME}" "InstallerLanguage" IfErrors lbl_end StrCpy $LANGUAGE $0 lbl_end: @@ -639,7 +639,7 @@ StrCpy $INSTSHORTCUT "${SHORTCUT}" Call CheckWindowsVersion ; warn if on Windows 98/ME Call CheckIfAdministrator ; Make sure the user can install/uninstall Call CheckIfAlreadyCurrent ; Make sure that we haven't already installed this version -Call CloseRainbowViewer ; Make sure we're not running +Call CloseCoolViewer ; Make sure we're not running ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Don't remove cache files during a regular install, removing the inventory cache on upgrades results in lots of damage to the servers. @@ -673,7 +673,7 @@ CreateDirectory "$SMPROGRAMS\$INSTSHORTCUT" SetOutPath "$INSTDIR" CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\$INSTSHORTCUT.lnk" \ "$INSTDIR\$INSTEXE" "$INSTFLAGS $SHORTCUT_LANG_PARAM" -WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\Rainbow Viewer Homepage.url" \ +WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\Cool Viewer Homepage.url" \ "InternetShortcut" "URL" \ "http://my.opera.com/boylane/" WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Scripting Language Help.url" \ @@ -695,11 +695,11 @@ CreateShortCut "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" \ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Write registry -WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\RainbowViewer\$INSTPROG" "" "$INSTDIR" -WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\RainbowViewer\$INSTPROG" "Version" "${VERSION_LONG}" -WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\RainbowViewer\$INSTPROG" "Flags" "$INSTFLAGS" -WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\RainbowViewer\$INSTPROG" "Shortcut" "$INSTSHORTCUT" -WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\RainbowViewer\$INSTPROG" "Exe" "$INSTEXE" +WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\CoolViewer\$INSTPROG" "" "$INSTDIR" +WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\CoolViewer\$INSTPROG" "Version" "${VERSION_LONG}" +WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\CoolViewer\$INSTPROG" "Flags" "$INSTFLAGS" +WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\CoolViewer\$INSTPROG" "Shortcut" "$INSTSHORTCUT" +WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\CoolViewer\$INSTPROG" "Exe" "$INSTEXE" WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "DisplayName" "$INSTPROG (remove only)" WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "UninstallString" '"$INSTDIR\uninst.exe"' diff --git a/linden/indra/newview/installers/windows/lang_en-us.nsi b/linden/indra/newview/installers/windows/lang_en-us.nsi index b860b5305814eaa655de892046da51e5ea635b3f..e1bee811a0620f3ba40363f162b9cc538c3b6093 100644 GIT binary patch delta 302 zcmexm@yC3_ITm(jhI}B**?gNtnGw$6X8VfZ@NyV3!DYO;s+nP&$(928lQ(edZ8qTh z16K|dJPuc&C}TL;PH+l)GQ^U}_XWe@a?V1baP~@31e;yh7A_trd>78P7MYA>j`Cy! zK7+}6LL6{;ZZXNpeS8{|8-yg_V#wxli#fu@1BI0**NE+d^Q}eVH!l<4f$(Ow)JlYp H6lEd-wU1A& delta 404 zcmexk{>x&+ITqd^hD3%;hCGHOhJ1$d%~x5J8PSCPvwlSv`ps_0gr>@vtC|^2Xe)0d znySg70>@DmO@1tJl(z`k36s|ghNG$B6$(WY$;1#jDrAeM=B=pmWF6sM=%T`tG3-;G wyh_9ZP2Ee8NHh^lJC}+&qN#Z+`Vd`2IDWH<_ztvy*!)>?C0d|PUMw9609b%(@c;k- diff --git a/linden/indra/newview/llagent.cpp b/linden/indra/newview/llagent.cpp index d5ce5b7..a67c4aa 100644 --- a/linden/indra/newview/llagent.cpp +++ b/linden/indra/newview/llagent.cpp @@ -132,6 +132,9 @@ #include "llfollowcam.h" extern LLMenuBarGL* gMenuBarView; +//MK +extern BOOL RRenabled; +//mk //drone wandering constants const F32 MAX_WANDER_TIME = 20.f; // seconds @@ -564,6 +567,12 @@ void LLAgent::resetView(BOOL reset_camera, BOOL change_camera) //----------------------------------------------------------------------------- void LLAgent::onAppFocusGained() { +//MK + if (RRenabled) + { + return; + } +//mk if (CAMERA_MODE_MOUSELOOK == mCameraMode) { changeCameraToDefault(); @@ -756,6 +765,12 @@ void LLAgent::movePitch(S32 direction) // Does this parcel allow you to fly? BOOL LLAgent::canFly() { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsFly) + { + return FALSE; + } +//mk if (isGodlike()) return TRUE; LLViewerRegion* regionp = getRegion(); @@ -795,6 +810,12 @@ void LLAgent::setFlying(BOOL fly) if (fly) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsFly) + { + return; + } +//mk BOOL was_flying = getFlying(); if (!canFly() && !was_flying) { @@ -845,8 +866,15 @@ void LLAgent::setRegion(LLViewerRegion *regionp) // host_name = regionp->getHost().getHostName(); std::string ip = regionp->getHost().getString(); - llinfos << "Moving agent into region: " << regionp->getName() +//MK + if (!RRenabled || !gAgent.mRRInterface.mContainsShowloc) + { +//mk + llinfos << "Moving agent into region: " << regionp->getName() << " located at " << ip << llendl; +//MK + } +//mk if (mRegionp) { // We've changed regions, we're now going to change our agent coordinate frame. @@ -4207,6 +4235,12 @@ void LLAgent::changeCameraToThirdPerson(BOOL animate) //----------------------------------------------------------------------------- void LLAgent::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL camera_animate) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsUnsit) + { + return; + } +//mk if (LLViewerJoystick::getInstance()->getOverrideCamera()) { return; @@ -6120,6 +6154,17 @@ void LLAgent::teleportRequest( // Landmark ID = LLUUID::null means teleport home void LLAgent::teleportViaLandmark(const LLUUID& landmark_asset_id) { +//MK + LLVOAvatar* avatar = gAgent.getAvatarObject(); + if (RRenabled && (LLStartUp::getStartupState() != STATE_STARTED || gViewerWindow->getShowProgress() + || gFocusMgr.focusLocked() || gAgent.mRRInterface.contains ("tplm") + || (gAgent.mRRInterface.mContainsUnsit && avatar && avatar->mIsSitting))) + { + return; + } + //// eliminate all restrictions issued from objects the avatar is not wearing + //gAgent.mRRInterface.garbageCollector (); +//mk LLViewerRegion *regionp = getRegion(); if(regionp && teleportCore()) { @@ -6135,6 +6180,13 @@ void LLAgent::teleportViaLandmark(const LLUUID& landmark_asset_id) void LLAgent::teleportViaLure(const LLUUID& lure_id, BOOL godlike) { +//MK + //// eliminate all restrictions issued from objects the avatar is not wearing + //if (RRenabled) + //{ + // gAgent.mRRInterface.garbageCollector (); + //} +//mk LLViewerRegion* regionp = getRegion(); if(regionp && teleportCore()) { @@ -6184,6 +6236,17 @@ void LLAgent::teleportCancel() void LLAgent::teleportViaLocation(const LLVector3d& pos_global) { +//MK + LLVOAvatar* avatar = gAgent.getAvatarObject(); + if (RRenabled && (LLStartUp::getStartupState() != STATE_STARTED || gViewerWindow->getShowProgress() + || gFocusMgr.focusLocked() || gAgent.mRRInterface.contains ("tploc") + || (gAgent.mRRInterface.mContainsUnsit && avatar && avatar->mIsSitting))) + { + return; + } + //// eliminate all restrictions issued from objects the avatar is not wearing + //gAgent.mRRInterface.garbageCollector (); +//mk LLViewerRegion* regionp = getRegion(); LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global); if(regionp && info) @@ -7327,7 +7390,16 @@ void LLAgent::sendAgentDataUpdateRequest() void LLAgent::removeWearable( EWearableType type ) { LLWearable* old_wearable = mWearableEntry[ type ].mWearable; - +//MK + if (RRenabled) + { + if (gAgent.mRRInterface.contains ("remoutfit") + || gAgent.mRRInterface.contains ("remoutfit:"+gAgent.mRRInterface.getOutfitLayerAsString (type))) + { + return; + } + } +//mk if ( (gAgent.isTeen()) && (type == WT_UNDERSHIRT || type == WT_UNDERPANTS)) { @@ -7556,9 +7628,31 @@ void LLAgent::setWearable( LLInventoryItem* new_item, LLWearable* new_wearable ) { EWearableType type = new_wearable->getType(); +//MK + if (RRenabled) + { + if (gAgent.mRRInterface.contains ("addoutfit") + || gAgent.mRRInterface.contains ("addoutfit:"+gAgent.mRRInterface.getOutfitLayerAsString (type))) + { + return; + } + } +//mk + LLWearable* old_wearable = mWearableEntry[ type ].mWearable; if( old_wearable ) { +//MK + if (RRenabled) + { + if (gAgent.mRRInterface.contains ("remoutfit") + || gAgent.mRRInterface.contains ("remoutfit:"+gAgent.mRRInterface.getOutfitLayerAsString (type))) + { + // cannot remove this outfit, so cannot replace it either + return; + } + } +//mk const LLUUID& old_item_id = mWearableEntry[ type ].mItemID; if( (old_wearable->getID() == new_wearable->getID()) && (old_item_id == new_item->getUUID()) ) diff --git a/linden/indra/newview/llagent.h b/linden/indra/newview/llagent.h index 8420947..b1b32de 100644 --- a/linden/indra/newview/llagent.h +++ b/linden/indra/newview/llagent.h @@ -64,6 +64,10 @@ #include "llviewerinventory.h" #include "llagentdata.h" +//MK +#include "RRInterface.h" +//mk + // Ventrella #include "llfollowcam.h" // end Ventrella @@ -133,6 +137,10 @@ class LLAgent : public LLObservable // typing state (for both chat and IM). static const F32 TYPING_TIMEOUT_SECS; +//MK + RRInterface mRRInterface; +//mk + LLAgent(); ~LLAgent(); diff --git a/linden/indra/newview/llappviewer.cpp b/linden/indra/newview/llappviewer.cpp index bc13bb9..2e18f85 100644 --- a/linden/indra/newview/llappviewer.cpp +++ b/linden/indra/newview/llappviewer.cpp @@ -200,6 +200,10 @@ extern BOOL gRandomizeFramerate; extern BOOL gPeriodicSlowFrame; extern BOOL gDebugGL; +//MK +extern BOOL RRenabled; +//mk + //////////////////////////////////////////////////////////// // All from the last globals push... const F32 DEFAULT_AFK_TIMEOUT = 5.f * 60.f; // time with no input before user flagged as Away From Keyboard @@ -280,10 +284,10 @@ BOOL gLogoutInProgress = FALSE; // Internal globals... that should be removed. static std::string gArgs; -const std::string MARKER_FILE_NAME("RainbowViewer.exec_marker"); -const std::string ERROR_MARKER_FILE_NAME("RainbowViewer.error_marker"); -const std::string LLERROR_MARKER_FILE_NAME("RainbowViewer.llerror_marker"); -const std::string LOGOUT_MARKER_FILE_NAME("RainbowViewer.logout_marker"); +const std::string MARKER_FILE_NAME("CoolViewer.exec_marker"); +const std::string ERROR_MARKER_FILE_NAME("CoolViewer.error_marker"); +const std::string LLERROR_MARKER_FILE_NAME("CoolViewer.llerror_marker"); +const std::string LOGOUT_MARKER_FILE_NAME("CoolViewer.logout_marker"); static BOOL gDoDisconnect = FALSE; static std::string gLaunchFileOnQuit; @@ -551,7 +555,7 @@ bool LLAppViewer::init() // Need to do this initialization before we do anything else, since anything // that touches files should really go through the lldir API - gDirUtilp->initAppDirs("RainbowViewer"); + gDirUtilp->initAppDirs("CoolViewer"); // set skin search path to default, will be overridden later // this allows simple skinned file lookups to work gDirUtilp->setSkinFolder("default"); @@ -857,6 +861,9 @@ bool LLAppViewer::mainLoop() LLTimer debugTime; LLViewerJoystick* joystick(LLViewerJoystick::getInstance()); joystick->setNeedsReset(true); +//MK + int garbage_collector_cnt=-3000; // give the garbage collector a few minutes before even kicking in the first time, in case we are logging in a very laggy place, taking time to rez +//mk // Handle messages while (!LLApp::isExiting()) @@ -917,6 +924,52 @@ bool LLAppViewer::mainLoop() gKeyboard->scanKeyboard(); } +//MK + // Do some RLV maintenance (garbage collector etc) + if (RRenabled && LLStartUp::getStartupState() == STATE_STARTED + && !gViewerWindow->getShowProgress() + && !gFocusMgr.focusLocked()) + { + // if RLV share inventory has not been fetched yet, fetch it now + gAgent.mRRInterface.fetchInventory (); + + // perform some maintenance only if no object is waiting to be reattached + if (gAgent.mRRInterface.sAssetsToReattach.empty()) + { + // fire all the stored commands that we received while initializing + gAgent.mRRInterface.fireCommands (); + + // fire the garbage collector for orphaned restrictions + if (++garbage_collector_cnt >= 600) { + gAgent.mRRInterface.garbageCollector (FALSE); + garbage_collector_cnt = 0; + } + + } + + // Decrease the automatic reattach timer, and reattach the object when it expires + if (gAgent.mRRInterface.sTimeBeforeReattaching > 0) + { + if (--gAgent.mRRInterface.sTimeBeforeReattaching <= 0) + { + // We must check whether there is an object waiting to be reattached after having been kicked off while locked. + // If there is one, let's reattach it here, to its default attach point. + if (!gAgent.mRRInterface.sAssetsToReattach.empty()) + { + AssetAndTarget& at = gAgent.mRRInterface.sAssetsToReattach.front(); + LLUUID tmp_uuid = at.uuid; + std::string tmp_attachpt = at.attachpt; + int tmp_attachpt_nb = 0; + LLViewerJointAttachment* attachpt = gAgent.mRRInterface.findAttachmentPointFromName(tmp_attachpt, true); + if (attachpt) tmp_attachpt_nb = gAgent.mRRInterface.findAttachmentPointNumber(attachpt); + llinfos << "Reattaching asset : " << tmp_uuid << " to point " << tmp_attachpt_nb << llendl; + gAgent.mRRInterface.attachObjectByUUID (tmp_uuid, tmp_attachpt_nb); + } + } + } + } +//mk + // Update state based on messages, user input, object idle. { pauseMainloopTimeout(); // *TODO: Remove. Messages shouldn't be stalling for 20+ seconds! @@ -1478,15 +1531,15 @@ bool LLAppViewer::initLogging() // Remove the last ".old" log file. std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, - "RainbowViewer.old"); + "CoolViewer.old"); LLFile::remove(old_log_file); // Rename current log file to ".old" std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, - "RainbowViewer.log"); + "CoolViewer.log"); LLFile::rename(log_file, old_log_file); - // Set the log file to RainbowViewer.log + // Set the log file to CoolViewer.log LLError::logToFile(log_file); @@ -1591,7 +1644,7 @@ bool LLAppViewer::initConfiguration() if(!loadSettingsFromDirectory(LL_PATH_APP_SETTINGS, set_defaults)) { std::ostringstream msg; - msg << "Rainbow Viewer could not load its default settings file. \n" + msg << "Cool Viewer could not load its default settings file. \n" << "The installation may be corrupted. \n"; OSMessageBox( @@ -1691,7 +1744,7 @@ bool LLAppViewer::initConfiguration() llinfos << "Command line usage:\n" << clp << llendl; std::ostringstream msg; - msg << "Rainbow Viewer found an error parsing the command line. \n" + msg << "Cool Viewer found an error parsing the command line. \n" << "Please see: http://wiki.secondlife.com/wiki/Client_parameters \n" << "Error: " << clp.getErrorMessage(); @@ -1838,28 +1891,38 @@ bool LLAppViewer::initConfiguration() // injection and steal passwords. Phoenix. SL-55321 if(clp.hasOption("url")) { - std::string slurl = clp.getOption("url")[0]; - if (LLURLDispatcher::isSLURLCommand(slurl)) - { - LLStartUp::sSLURLCommand = slurl; - } - else +//MK + if (!gSavedSettings.getBOOL("RestrainedLife")) { - LLURLSimString::setString(slurl); +//mk + std::string slurl = clp.getOption("url")[0]; + if (LLURLDispatcher::isSLURLCommand(slurl)) + { + LLStartUp::sSLURLCommand = slurl; + } + else + { + LLURLSimString::setString(slurl); + } } } else if(clp.hasOption("slurl")) { - std::string slurl = clp.getOption("slurl")[0]; - if(LLURLDispatcher::isSLURL(slurl)) +//MK + if (!gSavedSettings.getBOOL("RestrainedLife")) { - if (LLURLDispatcher::isSLURLCommand(slurl)) +//mk + std::string slurl = clp.getOption("slurl")[0]; + if(LLURLDispatcher::isSLURL(slurl)) { - LLStartUp::sSLURLCommand = slurl; - } - else - { - LLURLSimString::setString(slurl); + if (LLURLDispatcher::isSLURLCommand(slurl)) + { + LLStartUp::sSLURLCommand = slurl; + } + else + { + LLURLSimString::setString(slurl); + } } } } @@ -1873,7 +1936,7 @@ bool LLAppViewer::initConfiguration() mYieldTime = gSavedSettings.getS32("YieldTime"); // XUI:translate - gSecondLife = "Rainbow Viewer"; + gSecondLife = "Cool Viewer"; // Read skin/branding settings if specified. //if (! gDirUtilp->getSkinDir().empty() ) @@ -2440,10 +2503,10 @@ void LLAppViewer::initMarkerFile() LL_DEBUGS("MarkerFile") << "Checking marker file for lock..." << LL_ENDL; //We've got 4 things to test for here - // - Other Process Running (RainbowViewer.exec_marker present, locked) - // - Freeze (RainbowViewer.exec_marker present, not locked) - // - LLError Crash (RainbowViewer.llerror_marker present) - // - Other Crash (RainbowViewer.error_marker present) + // - Other Process Running (CoolViewer.exec_marker present, locked) + // - Freeze (CoolViewer.exec_marker present, not locked) + // - LLError Crash (CoolViewer.llerror_marker present) + // - Other Crash (CoolViewer.error_marker present) // These checks should also remove these files for the last 2 cases if they currently exist //LLError/Error checks. Only one of these should ever happen at a time. @@ -2636,11 +2699,11 @@ bool LLAppViewer::initCache() if (gLastRunVersion != gCurrentVersion) { // NOTE: (Nyx) as of 1.21, cache for mac is moving to /library/caches/SecondLife from - // /library/application support/RainbowViewer/cache This should clear/delete the old dir. + // /library/application support/CoolViewer/cache This should clear/delete the old dir. std::string cache_dir = gDirUtilp->getOSUserAppDir(); std::string new_cache_dir = gDirUtilp->getOSCacheDir(); cache_dir = cache_dir + "/cache"; - new_cache_dir = new_cache_dir + "/RainbowViewer"; + new_cache_dir = new_cache_dir + "/CoolViewer"; if (gDirUtilp->fileExists(cache_dir)) { gDirUtilp->setCacheDir(cache_dir); diff --git a/linden/indra/newview/llappviewerwin32.cpp b/linden/indra/newview/llappviewerwin32.cpp index b68cad6..4eb7a5c 100644 --- a/linden/indra/newview/llappviewerwin32.cpp +++ b/linden/indra/newview/llappviewerwin32.cpp @@ -400,61 +400,58 @@ bool LLAppViewerWin32::initHardwareTest() // Do driver verification and initialization based on DirectX // hardware polling and driver versions // - if (FALSE == gSavedSettings.getBOOL("NoHardwareProbe")) - { - BOOL vram_only = !gSavedSettings.getBOOL("ProbeHardwareOnStartup"); + BOOL vram_only = !gSavedSettings.getBOOL("ProbeHardwareOnStartup"); - // per DEV-11631 - disable hardware probing for everything - // but vram. - vram_only = TRUE; + // per DEV-11631 - disable hardware probing for everything + // but vram. + vram_only = TRUE; - LLSplashScreen::update("Detecting hardware..."); + LLSplashScreen::update("Detecting hardware..."); - LL_DEBUGS("AppInit") << "Attempting to poll DirectX for hardware info" << LL_ENDL; - gDXHardware.setWriteDebugFunc(write_debug_dx); - BOOL probe_ok = gDXHardware.getInfo(vram_only); + LL_DEBUGS("AppInit") << "Attempting to poll DirectX for hardware info" << LL_ENDL; + gDXHardware.setWriteDebugFunc(write_debug_dx); + BOOL probe_ok = gDXHardware.getInfo(vram_only); - if (!probe_ok - && gSavedSettings.getWarning("AboutDirectX9")) + if (!probe_ok + && gSavedSettings.getWarning("AboutDirectX9")) + { + LL_WARNS("AppInit") << "DirectX probe failed, alerting user." << LL_ENDL; + + // Warn them that runnin without DirectX 9 will + // not allow us to tell them about driver issues + std::ostringstream msg; + msg << + LLAppViewer::instance()->getSecondLifeTitle() << " is unable to detect DirectX 9.0b or greater.\n" + "\n" << + LLAppViewer::instance()->getSecondLifeTitle() << " uses DirectX to detect hardware and/or\n" + "outdated drivers that can cause stability problems,\n" + "poor performance and crashes. While you can run\n" << + LLAppViewer::instance()->getSecondLifeTitle() << " without it, we highly recommend running\n" + "with DirectX 9.0b\n" + "\n" + "Do you wish to continue?\n"; + S32 button = OSMessageBox( + msg.str(), + "Warning", + OSMB_YESNO); + if (OSBTN_NO== button) { - LL_WARNS("AppInit") << "DirectX probe failed, alerting user." << LL_ENDL; - - // Warn them that runnin without DirectX 9 will - // not allow us to tell them about driver issues - std::ostringstream msg; - msg << - LLAppViewer::instance()->getSecondLifeTitle() << " is unable to detect DirectX 9.0b or greater.\n" - "\n" << - LLAppViewer::instance()->getSecondLifeTitle() << " uses DirectX to detect hardware and/or\n" - "outdated drivers that can cause stability problems,\n" - "poor performance and crashes. While you can run\n" << - LLAppViewer::instance()->getSecondLifeTitle() << " without it, we highly recommend running\n" - "with DirectX 9.0b\n" - "\n" - "Do you wish to continue?\n"; - S32 button = OSMessageBox( - msg.str(), - "Warning", - OSMB_YESNO); - if (OSBTN_NO== button) - { - LL_INFOS("AppInit") << "User quitting after failed DirectX 9 detection" << LL_ENDL; - LLWeb::loadURLExternal(DIRECTX_9_URL); - return false; - } - gSavedSettings.setWarning("AboutDirectX9", FALSE); + LL_INFOS("AppInit") << "User quitting after failed DirectX 9 detection" << LL_ENDL; + LLWeb::loadURLExternal(DIRECTX_9_URL); + return false; } - LL_DEBUGS("AppInit") << "Done polling DirectX for hardware info" << LL_ENDL; + gSavedSettings.setWarning("AboutDirectX9", FALSE); + } + LL_DEBUGS("AppInit") << "Done polling DirectX for hardware info" << LL_ENDL; - // Only probe once after installation - gSavedSettings.setBOOL("ProbeHardwareOnStartup", FALSE); + // Only probe once after installation + gSavedSettings.setBOOL("ProbeHardwareOnStartup", FALSE); - // Disable so debugger can work - std::ostringstream splash_msg; - splash_msg << "Loading " << LLAppViewer::instance()->getSecondLifeTitle() << "..."; + // Disable so debugger can work + std::ostringstream splash_msg; + splash_msg << "Loading " << LLAppViewer::instance()->getSecondLifeTitle() << "..."; - LLSplashScreen::update(splash_msg.str()); - } + LLSplashScreen::update(splash_msg.str()); if (!restoreErrorTrap()) { diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp index b0155ef..a82150a 100644 --- a/linden/indra/newview/llchatbar.cpp +++ b/linden/indra/newview/llchatbar.cpp @@ -29,6 +29,10 @@ * $/LicenseInfo$ */ +//MK +#include "linden_common.h" +//mk + #include "llviewerprecompiledheaders.h" #include "llchatbar.h" @@ -67,6 +71,9 @@ #include "llviewermenu.h" #include "lluictrlfactory.h" +//MK +extern BOOL RRenabled; +//mk // // Globals @@ -95,20 +102,46 @@ class LLChatBarGestureObserver : public LLGestureManagerObserver // Functions // -LLChatBar::LLChatBar() -: LLPanel(LLStringUtil::null, LLRect(), BORDER_NO), +//inline constructor +// for chat bars embedded in floaters, etc +LLChatBar::LLChatBar(const std::string& name) +: LLPanel(name, LLRect(), BORDER_NO), + mInputEditor(NULL), + mGestureLabelTimer(), + mLastSpecialChatChannel(0), + mIsBuilt(FALSE), + mGestureCombo(NULL), + mSecondary(TRUE), + mObserver(NULL) +{ +} + +LLChatBar::LLChatBar(const std::string& name, const LLRect& rect) +: LLPanel(name, rect, BORDER_NO), mInputEditor(NULL), mGestureLabelTimer(), mLastSpecialChatChannel(0), mIsBuilt(FALSE), mGestureCombo(NULL), + mSecondary(FALSE), mObserver(NULL) { setIsChrome(TRUE); - #if !LL_RELEASE_FOR_DOWNLOAD - childDisplayNotFound(); -#endif + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_chat_bar.xml"); + + setFocusRoot(TRUE); + + setRect(rect); // override xml rect + + setBackgroundOpaque(TRUE); + setBackgroundVisible(TRUE); + + // Start visible if we left the app while chatting. + setVisible(gSavedSettings.getBOOL("ChatVisible")); + + // Apply custom layout. + layout(); } @@ -122,7 +155,8 @@ LLChatBar::~LLChatBar() BOOL LLChatBar::postBuild() { childSetAction("History", toggleChatHistory, this); - childSetCommitCallback("Say", onClickSay, this); + childSetAction("Say", onClickSay, this); + childSetAction("Shout", onClickShout, this); // attempt to bind to an existing combo box named gesture setGestureCombo(getChild( "Gesture")); @@ -159,6 +193,16 @@ BOOL LLChatBar::postBuild() // Overrides //----------------------------------------------------------------------- +// virtual +void LLChatBar::reshape(S32 width, S32 height, BOOL called_from_parent) +{ + LLPanel::reshape(width, height, called_from_parent); + if (mIsBuilt) + { + layout(); + } +} + // virtual BOOL LLChatBar::handleKeyHere( KEY key, MASK mask ) { @@ -197,8 +241,60 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask ) return handled; } +void LLChatBar::layout() +{ + // If this is not the main chat bar, return + if (mSecondary) return; + + S32 rect_width = getRect().getWidth(); + S32 pad = 4; + + LLRect gesture_rect; + S32 gesture_width = 0; + if (childGetRect("Gesture", gesture_rect)) + { + gesture_width = gesture_rect.getWidth(); + } + S32 input_width = 0; + S32 btn_width = 64; + S32 segment_width = btn_width + pad; + S32 x = pad; + S32 y = 3; + LLRect r; + + r.setOriginAndSize(x, y, btn_width, BTN_HEIGHT); + childSetRect("History", r); + + x += segment_width; + // Hack this one up so it looks nice. + if (mInputEditor) + { + input_width = rect_width - 3 * segment_width - 3 * pad - gesture_width; + r.setOriginAndSize(x, y + 2, input_width, 18); + mInputEditor->reshape(r.getWidth(), r.getHeight(), TRUE); + mInputEditor->setRect(r); + } + + x += input_width + pad; + r.setOriginAndSize(x, y, btn_width, BTN_HEIGHT); + childSetRect("Say", r); + + x += segment_width; + r.setOriginAndSize(x, y, btn_width, BTN_HEIGHT); + childSetRect("Shout", r); + + x = rect_width - (pad + gesture_width); + r.setOriginAndSize(x, y, gesture_width, BTN_HEIGHT); + childSetRect("Gesture", r); +} + void LLChatBar::refresh() { + if (!mSecondary) { + // call superclass setVisible so that we don't overwrite the saved setting + LLPanel::setVisible(gSavedSettings.getBOOL("ChatVisible")); + } + // HACK: Leave the name of the gesture in place for a few seconds. const F32 SHOW_GESTURE_NAME_TIME = 2.f; if (mGestureLabelTimer.getStarted() && mGestureLabelTimer.getElapsedTimeF32() > SHOW_GESTURE_NAME_TIME) @@ -213,11 +309,15 @@ void LLChatBar::refresh() gAgent.stopTyping(); } - childSetValue("History", LLFloaterChat::instanceVisible(LLSD())); - - childSetEnabled("Say", mInputEditor->getText().size() > 0); - childSetEnabled("Shout", mInputEditor->getText().size() > 0); + if (!mSecondary) { + childSetValue("History", LLFloaterChat::instanceVisible(LLSD())); + } + if (mInputEditor) + { + childSetEnabled("Say", mInputEditor->getText().size() > 0); + childSetEnabled("Shout", mInputEditor->getText().size() > 0); + } } void LLChatBar::refreshGestures() @@ -429,13 +529,31 @@ void LLChatBar::sendChat( EChatType type ) utf8text.replace(0, 1, "/me "); } } +//MK +//// // discard returned "found" boolean +//// gGestureManager.triggerAndReviseString(utf8text, &utf8_revised_text); + BOOL found_gesture=gGestureManager.triggerAndReviseString(utf8text, &utf8_revised_text); - // discard returned "found" boolean - gGestureManager.triggerAndReviseString(utf8text, &utf8_revised_text); + if (RRenabled && gAgent.mRRInterface.contains ("sendchat") && !gAgent.mRRInterface.containsSubstr ("redirchat:")) + { + // user is forbidden to send any chat message on channel 0 except emotes and OOC text + utf8_revised_text = gAgent.mRRInterface.crunchEmote (utf8_revised_text, 20); + if (found_gesture && utf8_revised_text=="...") utf8_revised_text=""; + } +//mk } else { - utf8_revised_text = utf8text; +//MK + std::ostringstream stream; + stream << "" << channel; + if (RRenabled && gAgent.mRRInterface.containsWithoutException ("sendchannel", stream.str())) + { + utf8_revised_text = ""; + } + else +//mk + utf8_revised_text = utf8text; } utf8_revised_text = utf8str_trim(utf8_revised_text); @@ -472,13 +590,16 @@ void LLChatBar::startChat(const char* line) gChatBar->setKeyboardFocus(TRUE); gSavedSettings.setBOOL("ChatVisible", TRUE); - if (line && gChatBar->mInputEditor) + if (gChatBar->mInputEditor) { - std::string line_string(line); - gChatBar->mInputEditor->setText(line_string); + if (line) + { + std::string line_string(line); + gChatBar->mInputEditor->setText(line_string); + } + // always move cursor to end so users don't obliterate chat when accidentally hitting WASD + gChatBar->mInputEditor->setCursorToEnd(); } - // always move cursor to end so users don't obliterate chat when accidentally hitting WASD - gChatBar->mInputEditor->setCursorToEnd(); } @@ -503,6 +624,15 @@ void LLChatBar::stopChat() gSavedSettings.setBOOL("ChatVisible", FALSE); } +void LLChatBar::setVisible(BOOL visible) +{ + // If this is not the main chat bar, return + if (mSecondary) return; + + gSavedSettings.setBOOL("ChatVisible", visible); + LLPanel::setVisible(visible); +} + // static void LLChatBar::onInputEditorKeystroke( LLLineEditor* caller, void* userdata ) { @@ -519,7 +649,10 @@ void LLChatBar::onInputEditorKeystroke( LLLineEditor* caller, void* userdata ) if( (length > 0) && (raw_text[0] != '/') ) // forward slash is used for escape (eg. emote) sequences { - gAgent.startTyping(); +//MK + if (!RRenabled || !gAgent.mRRInterface.containsSubstr ("redirchat:")) +//mk + gAgent.startTyping(); } else { @@ -587,19 +720,17 @@ void LLChatBar::onInputEditorGainFocus( LLFocusableElement* caller, void* userda } // static -void LLChatBar::onClickSay( LLUICtrl* ctrl, void* userdata ) +void LLChatBar::onClickSay( void* userdata ) { - e_chat_type chat_type = CHAT_TYPE_NORMAL; - if (ctrl->getValue().asString() == "shout") - { - chat_type = CHAT_TYPE_SHOUT; - } - else if (ctrl->getValue().asString() == "whisper") - { - chat_type = CHAT_TYPE_WHISPER; - } LLChatBar* self = (LLChatBar*) userdata; - self->sendChat(chat_type); + self->sendChat( CHAT_TYPE_NORMAL ); +} + +// static +void LLChatBar::onClickShout( void* userdata ) +{ + LLChatBar *self = (LLChatBar *)userdata; + self->sendChat( CHAT_TYPE_SHOUT ); } void LLChatBar::sendChatFromViewer(const std::string &utf8text, EChatType type, BOOL animate) @@ -621,6 +752,30 @@ void LLChatBar::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL utf8_text = utf8str_truncate(utf8_text, MAX_STRING - 1); } +//MK + if (RRenabled && channel == 0) + { + // transform the type according to chatshout, chatnormal and chatwhisper restrictions + if (type == CHAT_TYPE_WHISPER && gAgent.mRRInterface.contains ("chatwhisper")) + { + type = CHAT_TYPE_NORMAL; + } + if (type == CHAT_TYPE_SHOUT && gAgent.mRRInterface.contains ("chatshout")) + { + type = CHAT_TYPE_NORMAL; + } + if ((type == CHAT_TYPE_SHOUT || type == CHAT_TYPE_NORMAL) + && gAgent.mRRInterface.contains ("chatnormal")) + { + type = CHAT_TYPE_WHISPER; + } + + if (gAgent.mRRInterface.containsSubstr ("redirchat:")) + { + animate = false; + } + } +//mk // Don't animate for chats people can't hear (chat to scripts) if (animate && (channel == 0)) { @@ -658,13 +813,95 @@ void LLChatBar::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel) { +//MK + if (RRenabled && channel >= 2147483647 && gAgent.mRRInterface.contains ("sendchat")) + { + // When prevented from talking, remove the ability to talk on the DEBUG_CHANNEL altogether, since it is a way of cheating + return; + } + + if (RRenabled && channel == 0) + { + std::string restriction; + + // We might want to redirect this chat or emote (and exit this function early on) + if (utf8_out_text.find ("/me ") == 0 // emote + || utf8_out_text.find ("/me's") == 0) // emote + { + if (gAgent.mRRInterface.containsSubstr ("rediremote:")) + { + restriction = "rediremote:"; + } + } + else if (utf8_out_text.find ("((") != 0 || utf8_out_text.find ("))") != utf8_out_text.length () - 2) + { + if (gAgent.mRRInterface.containsSubstr ("redirchat:")) + { + restriction = "redirchat:"; + } + } + + if (!restriction.empty()) + { + // Public chat or emote redirected => for each redirection, send the same message on the target channel + RRMAP::iterator it = gAgent.mRRInterface.sSpecialObjectBehaviours.begin (); + std::string behav; + while (it != gAgent.mRRInterface.sSpecialObjectBehaviours.end()) + { + behav = it->second; + if (behav.find (restriction) == 0) + { + S32 ch = atoi (behav.substr (restriction.length()).c_str()); + std::ostringstream stream; + stream << "" << ch; + if (!gAgent.mRRInterface.containsWithoutException ("sendchannel", stream.str())) + { + if (ch > 0 && ch < 2147483647) + { + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_ChatFromViewer); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_ChatData); + msg->addStringFast(_PREHASH_Message, utf8_out_text); + msg->addU8Fast(_PREHASH_Type, type); + msg->addS32("Channel", ch); + + gAgent.sendReliableMessage(); + } + } + } + it++; + } + + LLViewerStats::getInstance()->incStat(LLViewerStats::ST_CHAT_COUNT); + + // We have redirected the chat message, don't send it on the original channel + return; + } + } + + std::string crunchedText = utf8_out_text; + + // There is a redirection in order but this particular message is an emote or an OOC text, so we didn't + // redirect it. However it has not gone through crunchEmote yet, so we need to do this here + if (RRenabled && channel == 0 && gAgent.mRRInterface.containsSubstr ("redirchat:")) + { + crunchedText = gAgent.mRRInterface.crunchEmote(crunchedText, 20); + } +//mk + LLMessageSystem* msg = gMessageSystem; msg->newMessageFast(_PREHASH_ChatFromViewer); msg->nextBlockFast(_PREHASH_AgentData); msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); msg->nextBlockFast(_PREHASH_ChatData); - msg->addStringFast(_PREHASH_Message, utf8_out_text); +//// msg->addStringFast(_PREHASH_Message, utf8_out_text); +//MK + msg->addStringFast(_PREHASH_Message, crunchedText); +//mk msg->addU8Fast(_PREHASH_Type, type); msg->addS32("Channel", channel); @@ -688,18 +925,25 @@ void LLChatBar::onCommitGesture(LLUICtrl* ctrl, void* data) } const std::string& trigger = gestures->getSelectedValue().asString(); - // pretend the user chatted the trigger string, to invoke - // substitution and logging. - std::string text(trigger); - std::string revised_text; - gGestureManager.triggerAndReviseString(text, &revised_text); - - revised_text = utf8str_trim(revised_text); - if (!revised_text.empty()) +//MK + if (!RRenabled || !gAgent.mRRInterface.contains ("sendchat")) { - // Don't play nodding animation - self->sendChatFromViewer(revised_text, CHAT_TYPE_NORMAL, FALSE); +//mk + // pretend the user chatted the trigger string, to invoke + // substitution and logging. + std::string text(trigger); + std::string revised_text; + gGestureManager.triggerAndReviseString(text, &revised_text); + + revised_text = utf8str_trim(revised_text); + if (!revised_text.empty()) + { + // Don't play nodding animation + self->sendChatFromViewer(revised_text, CHAT_TYPE_NORMAL, FALSE); + } +//MK } +//mk } self->mGestureLabelTimer.start(); if (self->mGestureCombo != NULL) @@ -727,7 +971,14 @@ class LLChatHandler : public LLCommandHandler if (tokens.size() < 2) return false; S32 channel = tokens[0].asInteger(); std::string mesg = tokens[1].asString(); - send_chat_from_viewer(mesg, CHAT_TYPE_NORMAL, channel); + EChatType type = CHAT_TYPE_NORMAL; +//MK + if (RRenabled && channel == 0 && gAgent.mRRInterface.contains ("chatnormal")) + { + type = CHAT_TYPE_WHISPER; + } +//mk + send_chat_from_viewer(mesg, type, channel); return true; } }; diff --git a/linden/indra/newview/llchatbar.cpp.orig b/linden/indra/newview/llchatbar.cpp.orig new file mode 100644 index 0000000..607e6cd --- /dev/null +++ b/linden/indra/newview/llchatbar.cpp.orig @@ -0,0 +1,884 @@ +/** + * @file llchatbar.cpp + * @brief LLChatBar class implementation + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + * + * Copyright (c) 2002-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +//MK +#include "linden_common.h" +//mk + +#include "llviewerprecompiledheaders.h" + +#include "llchatbar.h" + +#include "imageids.h" +#include "llfontgl.h" +#include "llrect.h" +#include "llerror.h" +#include "llparcel.h" +#include "llstring.h" +#include "message.h" +#include "llfocusmgr.h" + +#include "llagent.h" +#include "llbutton.h" +#include "llcombobox.h" +#include "llcommandhandler.h" // secondlife:///app/chat/ support +#include "llviewercontrol.h" +#include "llfloaterchat.h" +#include "llgesturemgr.h" +#include "llkeyboard.h" +#include "lllineeditor.h" +#include "llstatusbar.h" +#include "lltextbox.h" +#include "lluiconstants.h" +#include "llviewergesture.h" // for triggering gestures +#include "llviewermenu.h" // for deleting object with DEL key +#include "llviewerstats.h" +#include "llviewerwindow.h" +#include "llframetimer.h" +#include "llresmgr.h" +#include "llworld.h" +#include "llinventorymodel.h" +#include "llmultigesture.h" +#include "llui.h" +#include "llviewermenu.h" +#include "lluictrlfactory.h" + +//MK +extern BOOL RRenabled; +//mk + +// +// Globals +// +const F32 AGENT_TYPING_TIMEOUT = 5.f; // seconds + +LLChatBar *gChatBar = NULL; + +// legacy calllback glue +void toggleChatHistory(void* user_data); +void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel); + + +class LLChatBarGestureObserver : public LLGestureManagerObserver +{ +public: + LLChatBarGestureObserver(LLChatBar* chat_barp) : mChatBar(chat_barp){} + virtual ~LLChatBarGestureObserver() {} + virtual void changed() { mChatBar->refreshGestures(); } +private: + LLChatBar* mChatBar; +}; + + +// +// Functions +// + +LLChatBar::LLChatBar() +: LLPanel(LLStringUtil::null, LLRect(), BORDER_NO), + mInputEditor(NULL), + mGestureLabelTimer(), + mLastSpecialChatChannel(0), + mIsBuilt(FALSE), + mGestureCombo(NULL), + mObserver(NULL) +{ + setIsChrome(TRUE); + + #if !LL_RELEASE_FOR_DOWNLOAD + childDisplayNotFound(); +#endif +} + + +LLChatBar::~LLChatBar() +{ + delete mObserver; + mObserver = NULL; + // LLView destructor cleans up children +} + +BOOL LLChatBar::postBuild() +{ + childSetAction("History", toggleChatHistory, this); + childSetCommitCallback("Say", onClickSay, this); + + // attempt to bind to an existing combo box named gesture + setGestureCombo(getChild( "Gesture")); + + LLButton * sayp = getChild("Say"); + if(sayp) + { + setDefaultBtn(sayp); + } + + mInputEditor = getChild("Chat Editor"); + if (mInputEditor) + { + mInputEditor->setCallbackUserData(this); + mInputEditor->setKeystrokeCallback(&onInputEditorKeystroke); + mInputEditor->setFocusLostCallback(&onInputEditorFocusLost, this); + mInputEditor->setFocusReceivedCallback( &onInputEditorGainFocus, this ); + mInputEditor->setCommitOnFocusLost( FALSE ); + mInputEditor->setRevertOnEsc( FALSE ); + mInputEditor->setIgnoreTab(TRUE); + mInputEditor->setPassDelete(TRUE); + mInputEditor->setReplaceNewlinesWithSpaces(FALSE); + + mInputEditor->setMaxTextLength(1023); + mInputEditor->setEnableLineHistory(TRUE); + } + + mIsBuilt = TRUE; + + return TRUE; +} + +//----------------------------------------------------------------------- +// Overrides +//----------------------------------------------------------------------- + +// virtual +BOOL LLChatBar::handleKeyHere( KEY key, MASK mask ) +{ + BOOL handled = FALSE; + + // ALT-RETURN is reserved for windowed/fullscreen toggle + if( KEY_RETURN == key ) + { + if (mask == MASK_CONTROL) + { + // shout + sendChat(CHAT_TYPE_SHOUT); + handled = TRUE; + } + else if (mask == MASK_SHIFT) + { + // whisper + sendChat( CHAT_TYPE_WHISPER ); + handled = TRUE; + } + else if (mask == MASK_NONE) + { + // say + sendChat( CHAT_TYPE_NORMAL ); + handled = TRUE; + } + } + // only do this in main chatbar + else if (KEY_ESCAPE == key && mask == MASK_NONE && gChatBar == this) + { + stopChat(); + + handled = TRUE; + } + + return handled; +} + +void LLChatBar::refresh() +{ + // HACK: Leave the name of the gesture in place for a few seconds. + const F32 SHOW_GESTURE_NAME_TIME = 2.f; + if (mGestureLabelTimer.getStarted() && mGestureLabelTimer.getElapsedTimeF32() > SHOW_GESTURE_NAME_TIME) + { + LLCtrlListInterface* gestures = mGestureCombo ? mGestureCombo->getListInterface() : NULL; + if (gestures) gestures->selectFirstItem(); + mGestureLabelTimer.stop(); + } + + if ((gAgent.getTypingTime() > AGENT_TYPING_TIMEOUT) && (gAgent.getRenderState() & AGENT_STATE_TYPING)) + { + gAgent.stopTyping(); + } + + childSetValue("History", LLFloaterChat::instanceVisible(LLSD())); + + childSetEnabled("Say", mInputEditor->getText().size() > 0); + childSetEnabled("Shout", mInputEditor->getText().size() > 0); + +} + +void LLChatBar::refreshGestures() +{ + if (mGestureCombo) + { + //store current selection so we can maintain it + std::string cur_gesture = mGestureCombo->getValue().asString(); + mGestureCombo->selectFirstItem(); + std::string label = mGestureCombo->getValue().asString();; + // clear + mGestureCombo->clearRows(); + + // collect list of unique gestures + std::map unique; + LLGestureManager::item_map_t::iterator it; + for (it = gGestureManager.mActive.begin(); it != gGestureManager.mActive.end(); ++it) + { + LLMultiGesture* gesture = (*it).second; + if (gesture) + { + if (!gesture->mTrigger.empty()) + { + unique[gesture->mTrigger] = TRUE; + } + } + } + + // add unique gestures + std::map ::iterator it2; + for (it2 = unique.begin(); it2 != unique.end(); ++it2) + { + mGestureCombo->addSimpleElement((*it2).first); + } + + mGestureCombo->sortByName(); + // Insert label after sorting, at top, with separator below it + mGestureCombo->addSeparator(ADD_TOP); + mGestureCombo->addSimpleElement(getString("gesture_label"), ADD_TOP); + + if (!cur_gesture.empty()) + { + mGestureCombo->selectByValue(LLSD(cur_gesture)); + } + else + { + mGestureCombo->selectFirstItem(); + } + } +} + +// Move the cursor to the correct input field. +void LLChatBar::setKeyboardFocus(BOOL focus) +{ + if (focus) + { + if (mInputEditor) + { + mInputEditor->setFocus(TRUE); + mInputEditor->selectAll(); + } + } + else if (gFocusMgr.childHasKeyboardFocus(this)) + { + if (mInputEditor) + { + mInputEditor->deselect(); + } + setFocus(FALSE); + } +} + + +// Ignore arrow keys in chat bar +void LLChatBar::setIgnoreArrowKeys(BOOL b) +{ + if (mInputEditor) + { + mInputEditor->setIgnoreArrowKeys(b); + } +} + +BOOL LLChatBar::inputEditorHasFocus() +{ + return mInputEditor && mInputEditor->hasFocus(); +} + +std::string LLChatBar::getCurrentChat() +{ + return mInputEditor ? mInputEditor->getText() : LLStringUtil::null; +} + +void LLChatBar::setGestureCombo(LLComboBox* combo) +{ + mGestureCombo = combo; + if (mGestureCombo) + { + mGestureCombo->setCommitCallback(onCommitGesture); + mGestureCombo->setCallbackUserData(this); + + // now register observer since we have a place to put the results + mObserver = new LLChatBarGestureObserver(this); + gGestureManager.addObserver(mObserver); + + // refresh list from current active gestures + refreshGestures(); + } +} + +//----------------------------------------------------------------------- +// Internal functions +//----------------------------------------------------------------------- + +// If input of the form "/20foo" or "/20 foo", returns "foo" and channel 20. +// Otherwise returns input and channel 0. +LLWString LLChatBar::stripChannelNumber(const LLWString &mesg, S32* channel) +{ + if (mesg[0] == '/' + && mesg[1] == '/') + { + // This is a "repeat channel send" + *channel = mLastSpecialChatChannel; + return mesg.substr(2, mesg.length() - 2); + } + else if (mesg[0] == '/' + && mesg[1] + && LLStringOps::isDigit(mesg[1])) + { + // This a special "/20" speak on a channel + S32 pos = 0; + + // Copy the channel number into a string + LLWString channel_string; + llwchar c; + do + { + c = mesg[pos+1]; + channel_string.push_back(c); + pos++; + } + while(c && pos < 64 && LLStringOps::isDigit(c)); + + // Move the pointer forward to the first non-whitespace char + // Check isspace before looping, so we can handle "/33foo" + // as well as "/33 foo" + while(c && iswspace(c)) + { + c = mesg[pos+1]; + pos++; + } + + mLastSpecialChatChannel = strtol(wstring_to_utf8str(channel_string).c_str(), NULL, 10); + *channel = mLastSpecialChatChannel; + return mesg.substr(pos, mesg.length() - pos); + } + else + { + // This is normal chat. + *channel = 0; + return mesg; + } +} + + +void LLChatBar::sendChat( EChatType type ) +{ + if (mInputEditor) + { + LLWString text = mInputEditor->getConvertedText(); + if (!text.empty()) + { + // store sent line in history, duplicates will get filtered + if (mInputEditor) mInputEditor->updateHistory(); + // Check if this is destined for another channel + S32 channel = 0; + stripChannelNumber(text, &channel); + + std::string utf8text = wstring_to_utf8str(text); + // Try to trigger a gesture, if not chat to a script. + std::string utf8_revised_text; + if (0 == channel) + { + if (gSavedSettings.getBOOL("AutoCloseOOC")) + { + // Try to find any unclosed OOC chat (i.e. an opening + // double parenthesis without a matching closing double + // parenthesis. + if (utf8text.find("((") != -1 && utf8text.find("))") == -1) + { + if (utf8text.at(utf8text.length() - 1) == ')') + { + // cosmetic: add a space first to avoid a closing triple parenthesis + utf8text += " "; + } + // add the missing closing double parenthesis. + utf8text += "))"; + } + } + + // Convert MU*s style poses into IRC emotes here. + if (gSavedSettings.getBOOL("AllowMUpose") && utf8text.find(":") == 0 && utf8text.length() > 3) + { + if (utf8text.find(":'") == 0) + { + utf8text.replace(0, 1, "/me"); + } + else if (isalpha(utf8text.at(1))) // Do not prevent smileys and such. + { + utf8text.replace(0, 1, "/me "); + } + } +//MK +//// // discard returned "found" boolean +//// gGestureManager.triggerAndReviseString(utf8text, &utf8_revised_text); + BOOL found_gesture=gGestureManager.triggerAndReviseString(utf8text, &utf8_revised_text); + + if (RRenabled && gAgent.mRRInterface.contains ("sendchat") && !gAgent.mRRInterface.containsSubstr ("redirchat:")) + { + // user is forbidden to send any chat message on channel 0 except emotes and OOC text + utf8_revised_text = gAgent.mRRInterface.crunchEmote (utf8_revised_text, 20); + if (found_gesture && utf8_revised_text=="...") utf8_revised_text=""; + } +//mk + } + else + { +//MK + std::ostringstream stream; + stream << "" << channel; + if (RRenabled && gAgent.mRRInterface.containsWithoutException ("sendchannel", stream.str())) + { + utf8_revised_text = ""; + } + else +//mk + utf8_revised_text = utf8text; + } + + utf8_revised_text = utf8str_trim(utf8_revised_text); + + if (!utf8_revised_text.empty()) + { + // Chat with animation + sendChatFromViewer(utf8_revised_text, type, TRUE); + } + } + } + + childSetValue("Chat Editor", LLStringUtil::null); + + gAgent.stopTyping(); + + // If the user wants to stop chatting on hitting return, lose focus + // and go out of chat mode. + if (gChatBar == this && gSavedSettings.getBOOL("CloseChatOnReturn")) + { + stopChat(); + } +} + + +//----------------------------------------------------------------------- +// Static functions +//----------------------------------------------------------------------- + +// static +void LLChatBar::startChat(const char* line) +{ + gChatBar->setVisible(TRUE); + gChatBar->setKeyboardFocus(TRUE); + gSavedSettings.setBOOL("ChatVisible", TRUE); + + if (line && gChatBar->mInputEditor) + { + std::string line_string(line); + gChatBar->mInputEditor->setText(line_string); + } + // always move cursor to end so users don't obliterate chat when accidentally hitting WASD + gChatBar->mInputEditor->setCursorToEnd(); +} + + +// Exit "chat mode" and do the appropriate focus changes +// static +void LLChatBar::stopChat() +{ + // In simple UI mode, we never release focus from the chat bar + gChatBar->setKeyboardFocus(FALSE); + + // If we typed a movement key and pressed return during the + // same frame, the keyboard handlers will see the key as having + // gone down this frame and try to move the avatar. + gKeyboard->resetKeys(); + gKeyboard->resetMaskKeys(); + + // stop typing animation + gAgent.stopTyping(); + + // hide chat bar so it doesn't grab focus back + gChatBar->setVisible(FALSE); + gSavedSettings.setBOOL("ChatVisible", FALSE); +} + +// static +void LLChatBar::onInputEditorKeystroke( LLLineEditor* caller, void* userdata ) +{ + LLChatBar* self = (LLChatBar *)userdata; + + LLWString raw_text; + if (self->mInputEditor) raw_text = self->mInputEditor->getWText(); + + // Can't trim the end, because that will cause autocompletion + // to eat trailing spaces that might be part of a gesture. + LLWStringUtil::trimHead(raw_text); + + S32 length = raw_text.length(); + + if( (length > 0) && (raw_text[0] != '/') ) // forward slash is used for escape (eg. emote) sequences + { +//MK + if (!RRenabled || !gAgent.mRRInterface.containsSubstr ("redirchat:")) +//mk + gAgent.startTyping(); + } + else + { + gAgent.stopTyping(); + } + + /* Doesn't work -- can't tell the difference between a backspace + that killed the selection vs. backspace at the end of line. + if (length > 1 + && text[0] == '/' + && key == KEY_BACKSPACE) + { + // the selection will already be deleted, but we need to trim + // off the character before + std::string new_text = raw_text.substr(0, length-1); + self->mInputEditor->setText( new_text ); + self->mInputEditor->setCursorToEnd(); + length = length - 1; + } + */ + + KEY key = gKeyboard->currentKey(); + + // Ignore "special" keys, like backspace, arrows, etc. + if (length > 1 + && raw_text[0] == '/' + && key < KEY_SPECIAL) + { + // we're starting a gesture, attempt to autocomplete + + std::string utf8_trigger = wstring_to_utf8str(raw_text); + std::string utf8_out_str(utf8_trigger); + + if (gGestureManager.matchPrefix(utf8_trigger, &utf8_out_str)) + { + if (self->mInputEditor) + { + self->mInputEditor->setText(utf8_out_str); + S32 outlength = self->mInputEditor->getLength(); // in characters + + // Select to end of line, starting from the character + // after the last one the user typed. + self->mInputEditor->setSelection(length, outlength); + } + } + + //llinfos << "GESTUREDEBUG " << trigger + // << " len " << length + // << " outlen " << out_str.getLength() + // << llendl; + } +} + +// static +void LLChatBar::onInputEditorFocusLost( LLFocusableElement* caller, void* userdata) +{ + // stop typing animation + gAgent.stopTyping(); +} + +// static +void LLChatBar::onInputEditorGainFocus( LLFocusableElement* caller, void* userdata ) +{ + LLFloaterChat::setHistoryCursorAndScrollToEnd(); +} + +// static +void LLChatBar::onClickSay( LLUICtrl* ctrl, void* userdata ) +{ + e_chat_type chat_type = CHAT_TYPE_NORMAL; + if (ctrl->getValue().asString() == "shout") + { + chat_type = CHAT_TYPE_SHOUT; + } + else if (ctrl->getValue().asString() == "whisper") + { + chat_type = CHAT_TYPE_WHISPER; + } + LLChatBar* self = (LLChatBar*) userdata; + self->sendChat(chat_type); +} + +void LLChatBar::sendChatFromViewer(const std::string &utf8text, EChatType type, BOOL animate) +{ + sendChatFromViewer(utf8str_to_wstring(utf8text), type, animate); +} + +void LLChatBar::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate) +{ + // Look for "/20 foo" channel chats. + S32 channel = 0; + LLWString out_text = stripChannelNumber(wtext, &channel); + std::string utf8_out_text = wstring_to_utf8str(out_text); + std::string utf8_text = wstring_to_utf8str(wtext); + + utf8_text = utf8str_trim(utf8_text); + if (!utf8_text.empty()) + { + utf8_text = utf8str_truncate(utf8_text, MAX_STRING - 1); + } + +//MK + if (RRenabled && channel == 0) + { + // transform the type according to chatshout, chatnormal and chatwhisper restrictions + if (type == CHAT_TYPE_WHISPER && gAgent.mRRInterface.contains ("chatwhisper")) + { + type = CHAT_TYPE_NORMAL; + } + if (type == CHAT_TYPE_SHOUT && gAgent.mRRInterface.contains ("chatshout")) + { + type = CHAT_TYPE_NORMAL; + } + if ((type == CHAT_TYPE_SHOUT || type == CHAT_TYPE_NORMAL) + && gAgent.mRRInterface.contains ("chatnormal")) + { + type = CHAT_TYPE_WHISPER; + } + + if (gAgent.mRRInterface.containsSubstr ("redirchat:")) + { + animate = false; + } + } +//mk + // Don't animate for chats people can't hear (chat to scripts) + if (animate && (channel == 0)) + { + if (type == CHAT_TYPE_WHISPER) + { + lldebugs << "You whisper " << utf8_text << llendl; + gAgent.sendAnimationRequest(ANIM_AGENT_WHISPER, ANIM_REQUEST_START); + } + else if (type == CHAT_TYPE_NORMAL) + { + lldebugs << "You say " << utf8_text << llendl; + gAgent.sendAnimationRequest(ANIM_AGENT_TALK, ANIM_REQUEST_START); + } + else if (type == CHAT_TYPE_SHOUT) + { + lldebugs << "You shout " << utf8_text << llendl; + gAgent.sendAnimationRequest(ANIM_AGENT_SHOUT, ANIM_REQUEST_START); + } + else + { + llinfos << "send_chat_from_viewer() - invalid volume" << llendl; + return; + } + } + else + { + if (type != CHAT_TYPE_START && type != CHAT_TYPE_STOP) + { + lldebugs << "Channel chat: " << utf8_text << llendl; + } + } + + send_chat_from_viewer(utf8_out_text, type, channel); +} + +void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel) +{ +//MK + if (RRenabled && channel >= 2147483647 && gAgent.mRRInterface.contains ("sendchat")) + { + // When prevented from talking, remove the ability to talk on the DEBUG_CHANNEL altogether, since it is a way of cheating + return; + } + + if (RRenabled && channel == 0) + { + std::string restriction; + + // We might want to redirect this chat or emote (and exit this function early on) + if (utf8_out_text.find ("/me ") == 0 // emote + || utf8_out_text.find ("/me's") == 0) // emote + { + if (gAgent.mRRInterface.containsSubstr ("rediremote:")) + { + restriction = "rediremote:"; + } + } + else if (utf8_out_text.find ("((") != 0 || utf8_out_text.find ("))") != utf8_out_text.length () - 2) + { + if (gAgent.mRRInterface.containsSubstr ("redirchat:")) + { + restriction = "redirchat:"; + } + } + + if (!restriction.empty()) + { + // Public chat or emote redirected => for each redirection, send the same message on the target channel + RRMAP::iterator it = gAgent.mRRInterface.sSpecialObjectBehaviours.begin (); + std::string behav; + while (it != gAgent.mRRInterface.sSpecialObjectBehaviours.end()) + { + behav = it->second; + if (behav.find (restriction) == 0) + { + S32 ch = atoi (behav.substr (restriction.length()).c_str()); + std::ostringstream stream; + stream << "" << ch; + if (!gAgent.mRRInterface.containsWithoutException ("sendchannel", stream.str())) + { + if (ch > 0 && ch < 2147483647) + { + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_ChatFromViewer); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_ChatData); + msg->addStringFast(_PREHASH_Message, utf8_out_text); + msg->addU8Fast(_PREHASH_Type, type); + msg->addS32("Channel", ch); + + gAgent.sendReliableMessage(); + } + } + } + it++; + } + + LLViewerStats::getInstance()->incStat(LLViewerStats::ST_CHAT_COUNT); + + // We have redirected the chat message, don't send it on the original channel + return; + } + } + + std::string crunchedText = utf8_out_text; + + // There is a redirection in order but this particular message is an emote or an OOC text, so we didn't + // redirect it. However it has not gone through crunchEmote yet, so we need to do this here + if (RRenabled && channel == 0 && gAgent.mRRInterface.containsSubstr ("redirchat:")) + { + crunchedText = gAgent.mRRInterface.crunchEmote(crunchedText, 20); + } +//mk + + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_ChatFromViewer); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_ChatData); +//// msg->addStringFast(_PREHASH_Message, utf8_out_text); +//MK + msg->addStringFast(_PREHASH_Message, crunchedText); +//mk + msg->addU8Fast(_PREHASH_Type, type); + msg->addS32("Channel", channel); + + gAgent.sendReliableMessage(); + + LLViewerStats::getInstance()->incStat(LLViewerStats::ST_CHAT_COUNT); +} + + +// static +void LLChatBar::onCommitGesture(LLUICtrl* ctrl, void* data) +{ + LLChatBar* self = (LLChatBar*)data; + LLCtrlListInterface* gestures = self->mGestureCombo ? self->mGestureCombo->getListInterface() : NULL; + if (gestures) + { + S32 index = gestures->getFirstSelectedIndex(); + if (index == 0) + { + return; + } + const std::string& trigger = gestures->getSelectedValue().asString(); + +//MK + if (!RRenabled || !gAgent.mRRInterface.contains ("sendchat")) + { +//mk + // pretend the user chatted the trigger string, to invoke + // substitution and logging. + std::string text(trigger); + std::string revised_text; + gGestureManager.triggerAndReviseString(text, &revised_text); + + revised_text = utf8str_trim(revised_text); + if (!revised_text.empty()) + { + // Don't play nodding animation + self->sendChatFromViewer(revised_text, CHAT_TYPE_NORMAL, FALSE); + } +//MK + } +//mk + } + self->mGestureLabelTimer.start(); + if (self->mGestureCombo != NULL) + { + // free focus back to chat bar + self->mGestureCombo->setFocus(FALSE); + } +} + +void toggleChatHistory(void* user_data) +{ + LLFloaterChat::toggleInstance(LLSD()); +} + + +class LLChatHandler : public LLCommandHandler +{ +public: + // not allowed from outside the app + LLChatHandler() : LLCommandHandler("chat", false) { } + + // Your code here + bool handle(const LLSD& tokens, const LLSD& queryMap) + { + if (tokens.size() < 2) return false; + S32 channel = tokens[0].asInteger(); + std::string mesg = tokens[1].asString(); + EChatType type = CHAT_TYPE_NORMAL; +//MK + if (RRenabled && channel == 0 && gAgent.mRRInterface.contains ("chatnormal")) + { + type = CHAT_TYPE_WHISPER; + } +//mk + send_chat_from_viewer(mesg, type, channel); + return true; + } +}; + +// Creating the object registers with the dispatcher. +LLChatHandler gChatHandler; diff --git a/linden/indra/newview/llchatbar.h b/linden/indra/newview/llchatbar.h index 72c797a..1e8ddac 100644 --- a/linden/indra/newview/llchatbar.h +++ b/linden/indra/newview/llchatbar.h @@ -49,12 +49,17 @@ class LLChatBar { public: // constructor for inline chat-bars (e.g. hosted in chat history window) - LLChatBar(); + LLChatBar(const std::string& name); + LLChatBar(const std::string& name, const LLRect& rect); ~LLChatBar(); virtual BOOL postBuild(); + virtual void reshape(S32 width, S32 height, BOOL called_from_parent); virtual BOOL handleKeyHere(KEY key, MASK mask); + // Adjust buttons and input field for width + void layout(); + void refresh(); void refreshGestures(); @@ -81,7 +86,8 @@ class LLChatBar LLWString stripChannelNumber(const LLWString &mesg, S32* channel); // callbacks - static void onClickSay( LLUICtrl*, void* userdata ); + static void onClickSay( void* userdata ); + static void onClickShout( void* userdata ); static void onTabClick( void* userdata ); static void onInputEditorKeystroke(LLLineEditor* caller, void* userdata); @@ -93,11 +99,15 @@ class LLChatBar static void startChat(const char* line); static void stopChat(); + /*virtual*/ void setVisible(BOOL visible); + protected: void sendChat(EChatType type); void updateChat(); protected: + BOOL mSecondary; + LLLineEditor* mInputEditor; LLFrameTimer mGestureLabelTimer; diff --git a/linden/indra/newview/llconsole.cpp b/linden/indra/newview/llconsole.cpp index 941c9ca..69665de 100644 --- a/linden/indra/newview/llconsole.cpp +++ b/linden/indra/newview/llconsole.cpp @@ -186,6 +186,10 @@ void LLConsole::draw() //080813 Spatters: This section makes a single huge black box behind all the text. S32 bkg_height=4; + if (gSavedSettings.getBOOL("DisableMessagesSpacing")) { + message_spacing = 0; + bkg_height = 8; + } S32 bkg_width=0; for(paragraph_it = mParagraphs.rbegin(); paragraph_it != mParagraphs.rend(); paragraph_it++) { diff --git a/linden/indra/newview/llfloaterabout.cpp b/linden/indra/newview/llfloaterabout.cpp index 19b7653..0312836 100644 --- a/linden/indra/newview/llfloaterabout.cpp +++ b/linden/indra/newview/llfloaterabout.cpp @@ -63,6 +63,9 @@ extern LLCPUInfo gSysCPU; extern LLMemoryInfo gSysMemory; extern U32 gPacketsIn; +//MK +extern BOOL RRenabled; +//mk ///---------------------------------------------------------------------------- /// Local function declarations, constants, enums, and typedefs @@ -115,6 +118,12 @@ LLFloaterAbout::LLFloaterAbout() LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VIEWER_BUILD, __DATE__, __TIME__, gSavedSettings.getString("VersionChannelName").c_str()); +//MK + if (RRenabled) + { + version += gAgent.mRRInterface.getVersion () + "\n"; + } +//mk support_widget->appendColoredText(version, FALSE, FALSE, gColors.getColor("TextFgReadOnlyColor")); support_widget->appendStyledText(LLTrans::getString("ReleaseNotes"), FALSE, FALSE, &viewer_link_style); @@ -135,22 +144,44 @@ LLFloaterAbout::LLFloaterAbout() LLUIString pos_text = getString("you_are_at"); pos_text.setArg("[POSITION]", llformat("%.1f, %.1f, %.1f ", pos.mdV[VX], pos.mdV[VY], pos.mdV[VZ])); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + pos_text = "(Position hidden)\n"; + } +//mk support.append(pos_text); std::string region_text = llformat("in %s located at ", gAgent.getRegion()->getName().c_str()); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + region_text = "(Region hidden)\n"; + } +//mk support.append(region_text); - std::string buffer; - buffer = gAgent.getRegion()->getHost().getHostName(); - support.append(buffer); - support.append(" ("); - buffer = gAgent.getRegion()->getHost().getString(); - support.append(buffer); - support.append(")\n"); - support.append(gLastVersionChannel); - support.append("\n"); - +//MK + if (!RRenabled || !gAgent.mRRInterface.mContainsShowloc) + { +//mk + std::string buffer; + buffer = gAgent.getRegion()->getHost().getHostName(); + support.append(buffer); + support.append(" ("); + buffer = gAgent.getRegion()->getHost().getString(); + support.append(buffer); + support.append(")\n"); + support.append(gLastVersionChannel); + support.append("\n"); +//MK + } + else + { + support.append ("(Server info hidden)\n\n"); + } +//mk support_widget->appendColoredText(support, FALSE, FALSE, gColors.getColor("TextFgReadOnlyColor")); support_widget->appendStyledText(LLTrans::getString("ReleaseNotes"), FALSE, FALSE, &server_link_style); diff --git a/linden/indra/newview/llfloateravatarlist.cpp b/linden/indra/newview/llfloateravatarlist.cpp index 8ee88b6..9cce618 100644 --- a/linden/indra/newview/llfloateravatarlist.cpp +++ b/linden/indra/newview/llfloateravatarlist.cpp @@ -53,6 +53,10 @@ #include "llsdutil.h" +//MK +extern BOOL RRenabled; +//mk + /** * @brief How long to keep people who are gone in the list and in memory. */ @@ -238,6 +242,15 @@ LLFloaterAvatarList::~LLFloaterAvatarList() //static void LLFloaterAvatarList::toggle(void*) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + if (sInstance && sInstance->getVisible()) + { + sInstance->close(false); + } + } +//mk if (sInstance) { if (sInstance->getVisible()) @@ -258,6 +271,12 @@ void LLFloaterAvatarList::toggle(void*) //static void LLFloaterAvatarList::showInstance() { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + return; + } +//mk if (sInstance) { if (!sInstance->getVisible()) @@ -434,6 +453,12 @@ void LLFloaterAvatarList::updateAvatarList() continue; } } +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + name = gAgent.mRRInterface.getDummyName(name); + } +//mk if (avid.isNull()) { @@ -474,6 +499,12 @@ void LLFloaterAvatarList::updateAvatarList() //name = gCacheName->getDefaultName(); continue; //prevent (Loading...) } +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + name = gAgent.mRRInterface.getDummyName(name); + } +//mk if (mAvatars.count(avid) > 0) { diff --git a/linden/indra/newview/llfloaterbeacons.cpp b/linden/indra/newview/llfloaterbeacons.cpp index 2dee000..df6c8cc 100644 --- a/linden/indra/newview/llfloaterbeacons.cpp +++ b/linden/indra/newview/llfloaterbeacons.cpp @@ -37,6 +37,11 @@ #include "llcheckboxctrl.h" #include "pipeline.h" +//MK +#include "llagent.h" + +extern BOOL RRenabled; +//mk LLFloaterBeacons::LLFloaterBeacons(const LLSD& seed) { @@ -72,6 +77,12 @@ BOOL LLFloaterBeacons::postBuild() // Too bad we can't just add control_name="BeaconAlwaysOn" to the XML. void LLFloaterBeacons::open() { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsEdit) + { + return; + } +//mk LLFloater::open(); gSavedSettings.setBOOL( "BeaconAlwaysOn", TRUE); } @@ -92,6 +103,23 @@ void LLFloaterBeacons::onClickUICheck(LLUICtrl *ctrl, void* data) LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl; std::string name = check->getName(); LLFloaterBeacons* view = (LLFloaterBeacons*)data; +//MK + if (RRenabled && gAgent.mRRInterface.mContainsEdit) + { + LLPipeline::setRenderScriptedBeacons(FALSE); + LLPipeline::setRenderScriptedTouchBeacons(FALSE); + view->getChild("scripted")->setControlValue(LLSD(FALSE)); + view->getChild("touch_only")->setControlValue(LLSD(FALSE)); + LLPipeline::setRenderPhysicalBeacons(FALSE); + LLPipeline::setRenderSoundBeacons(FALSE); + LLPipeline::setRenderParticleBeacons(FALSE); + LLPipeline::setRenderBeacons(FALSE); + LLPipeline::setRenderHighlights(FALSE); + view->getChild("beacons")->setControlValue(LLSD(FALSE)); + view->getChild("highlights")->setControlValue(LLSD(FALSE)); + return; + } +//mk if( name == "touch_only") { LLPipeline::toggleRenderScriptedTouchBeacons(NULL); diff --git a/linden/indra/newview/llfloaterbuyland.cpp b/linden/indra/newview/llfloaterbuyland.cpp index 1ad45e1..447fb5a 100644 --- a/linden/indra/newview/llfloaterbuyland.cpp +++ b/linden/indra/newview/llfloaterbuyland.cpp @@ -34,6 +34,7 @@ #include "llfloaterbuyland.h" // viewer includes +#include "llxmlrpctransaction.h" #include "llagent.h" #include "llbutton.h" #include "llcachename.h" @@ -61,7 +62,6 @@ #include "llweb.h" #include "llwindow.h" #include "llworld.h" -#include "llxmlrpctransaction.h" #include "llviewernetwork.h" #include "roles_constants.h" @@ -71,6 +71,9 @@ const F64 CURRENCY_ESTIMATE_FREQUENCY = 0.5; // how long of a pause in typing a currency buy amount before an // esimate is fetched from the server +//MK +extern BOOL RRenabled; +//mk class LLFloaterBuyLandUI : public LLFloater { @@ -826,6 +829,12 @@ void LLFloaterBuyLandUI::updateNames() { gCacheName->getFullName(parcelp->getOwnerID(), mParcelSellerName); } +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + mParcelSellerName = gAgent.mRRInterface.getDummyName (mParcelSellerName); + } +//mk } diff --git a/linden/indra/newview/llfloaterchat.cpp b/linden/indra/newview/llfloaterchat.cpp index f83ce6c..e336e18 100644 --- a/linden/indra/newview/llfloaterchat.cpp +++ b/linden/indra/newview/llfloaterchat.cpp @@ -74,6 +74,10 @@ #include "llweb.h" #include "llstylemap.h" +//MK +extern BOOL RRenabled; +//mk + // Used for LCD display extern void AddNewIMToLCD(const std::string &newLine); extern void AddNewChatToLCD(const std::string &newLine); @@ -102,7 +106,14 @@ LLFloaterChat::LLFloaterChat(const LLSD& seed) mFactoryMap["active_speakers_panel"] = LLCallbackMap(createSpeakersPanel, NULL); // do not automatically open singleton floaters (as result of getInstance()) BOOL no_open = FALSE; - LLUICtrlFactory::getInstance()->buildFloater(this,"floater_chat_history.xml",&getFactoryMap(),no_open); + if (gSavedSettings.getBOOL("UseOldChatHistory")) + { + LLUICtrlFactory::getInstance()->buildFloater(this,"floater_chat_history2.xml",&getFactoryMap(),no_open); + } + else + { + LLUICtrlFactory::getInstance()->buildFloater(this,"floater_chat_history.xml",&getFactoryMap(),no_open); + } childSetCommitCallback("show mutes",onClickToggleShowMute,this); //show mutes childSetVisible("Chat History Editor with mute",FALSE); @@ -205,11 +216,18 @@ void add_timestamped_line(LLViewerTextEditor* edit, const LLChat &chat, const LL chat.mFromID != LLUUID::null && (line.length() > chat.mFromName.length() && line.find(chat.mFromName,0) == 0)) { +//MK + if (!RRenabled || !gAgent.mRRInterface.mContainsShownames) + { +//mk std::string start_line = line.substr(0, chat.mFromName.length() + 1); line = line.substr(chat.mFromName.length() + 1); const LLStyleSP &sourceStyle = LLStyleMap::instance().lookup(chat.mFromID); edit->appendStyledText(start_line, false, prepend_newline, &sourceStyle); prepend_newline = false; +//MK + } +//mk } edit->appendColoredText(line, false, prepend_newline, color); } @@ -501,7 +519,7 @@ void* LLFloaterChat::createSpeakersPanel(void* data) //static void* LLFloaterChat::createChatPanel(void* data) { - LLChatBar* chatp = new LLChatBar(); + LLChatBar* chatp = new LLChatBar("floating_chat_bar"); return chatp; } @@ -509,7 +527,12 @@ void* LLFloaterChat::createChatPanel(void* data) void LLFloaterChat::onClickToggleActiveSpeakers(void* userdata) { LLFloaterChat* self = (LLFloaterChat*)userdata; - +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + if (!self->childIsVisible("active_speakers_panel")) return; + } +//mk self->childSetVisible("active_speakers_panel", !self->childIsVisible("active_speakers_panel")); } diff --git a/linden/indra/newview/llfloaterchat.cpp.orig b/linden/indra/newview/llfloaterchat.cpp.orig new file mode 100644 index 0000000..211215e --- /dev/null +++ b/linden/indra/newview/llfloaterchat.cpp.orig @@ -0,0 +1,555 @@ +/** + * @file llfloaterchat.cpp + * @brief LLFloaterChat class implementation + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + * + * Copyright (c) 2002-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +/** + * Actually the "Chat History" floater. + * Should be llfloaterchathistory, not llfloaterchat. + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloaterchat.h" +#include "llfloateractivespeakers.h" +#include "llfloaterscriptdebug.h" + +#include "llchat.h" +#include "llfontgl.h" +#include "llrect.h" +#include "llerror.h" +#include "llstring.h" +#include "message.h" + +// project include +#include "llagent.h" +#include "llbutton.h" +#include "llcheckboxctrl.h" +#include "llcombobox.h" +#include "llconsole.h" +#include "llfloaterchatterbox.h" +#include "llfloatermute.h" +#include "llkeyboard.h" +//#include "lllineeditor.h" +#include "llmutelist.h" +//#include "llresizehandle.h" +#include "llchatbar.h" +#include "llstatusbar.h" +#include "llviewertexteditor.h" +#include "llviewergesture.h" // for triggering gestures +#include "llviewermessage.h" +#include "llviewerwindow.h" +#include "llviewercontrol.h" +#include "lluictrlfactory.h" +#include "llchatbar.h" +#include "lllogchat.h" +#include "lltexteditor.h" +#include "llfloaterhtml.h" +#include "llweb.h" +#include "llstylemap.h" + +//MK +extern BOOL RRenabled; +//mk + +// Used for LCD display +extern void AddNewIMToLCD(const std::string &newLine); +extern void AddNewChatToLCD(const std::string &newLine); +// +// Constants +// +const F32 INSTANT_MSG_SIZE = 8.0f; +const F32 CHAT_MSG_SIZE = 8.0f; +const LLColor4 MUTED_MSG_COLOR(0.5f, 0.5f, 0.5f, 1.f); +const S32 MAX_CHATTER_COUNT = 16; + +// +// Global statics +// +LLColor4 get_text_color(const LLChat& chat); + +// +// Member Functions +// +LLFloaterChat::LLFloaterChat(const LLSD& seed) +: LLFloater(std::string("chat floater"), std::string("FloaterChatRect"), LLStringUtil::null, + RESIZE_YES, 440, 100, DRAG_ON_TOP, MINIMIZE_NO, CLOSE_YES), + mPanel(NULL) +{ + mFactoryMap["chat_panel"] = LLCallbackMap(createChatPanel, NULL); + mFactoryMap["active_speakers_panel"] = LLCallbackMap(createSpeakersPanel, NULL); + // do not automatically open singleton floaters (as result of getInstance()) + BOOL no_open = FALSE; + LLUICtrlFactory::getInstance()->buildFloater(this,"floater_chat_history.xml",&getFactoryMap(),no_open); + + childSetCommitCallback("show mutes",onClickToggleShowMute,this); //show mutes + childSetVisible("Chat History Editor with mute",FALSE); + childSetAction("toggle_active_speakers_btn", onClickToggleActiveSpeakers, this); + setDefaultBtn("Chat"); +} + +LLFloaterChat::~LLFloaterChat() +{ + // Children all cleaned up by default view destructor. +} + +void LLFloaterChat::setVisible(BOOL visible) +{ + LLFloater::setVisible( visible ); + + gSavedSettings.setBOOL("ShowChatHistory", visible); +} + +void LLFloaterChat::draw() +{ + // enable say and shout only when text available + + childSetValue("toggle_active_speakers_btn", childIsVisible("active_speakers_panel")); + + LLChatBar* chat_barp = getChild("chat_panel", TRUE); + if (chat_barp) + { + chat_barp->refresh(); + } + + mPanel->refreshSpeakers(); + LLFloater::draw(); +} + +BOOL LLFloaterChat::postBuild() +{ + mPanel = (LLPanelActiveSpeakers*)getChild("active_speakers_panel"); + + LLChatBar* chat_barp = getChild("chat_panel", TRUE); + if (chat_barp) + { + chat_barp->setGestureCombo(getChild( "Gesture")); + } + return TRUE; +} + +// public virtual +void LLFloaterChat::onClose(bool app_quitting) +{ + if (!app_quitting) + { + gSavedSettings.setBOOL("ShowChatHistory", FALSE); + } + setVisible(FALSE); +} + +void LLFloaterChat::onVisibilityChange(BOOL new_visibility) +{ + // Hide the chat overlay when our history is visible. + updateConsoleVisibility(); + + // stop chat history tab from flashing when it appears + if (new_visibility) + { + LLFloaterChatterBox::getInstance()->setFloaterFlashing(this, FALSE); + } + + LLFloater::onVisibilityChange(new_visibility); +} + +void LLFloaterChat::setMinimized(BOOL minimized) +{ + LLFloater::setMinimized(minimized); + updateConsoleVisibility(); +} + + +void LLFloaterChat::updateConsoleVisibility() +{ + // determine whether we should show console due to not being visible + gConsole->setVisible( !isInVisibleChain() // are we not in part of UI being drawn? + || isMinimized() // are we minimized? + || (getHost() && getHost()->isMinimized() )); // are we hosted in a minimized floater? +} + +void add_timestamped_line(LLViewerTextEditor* edit, const LLChat &chat, const LLColor4& color) +{ + std::string line = chat.mText; + bool prepend_newline = true; + if (gSavedSettings.getBOOL("ChatShowTimestamps")) + { + edit->appendTime(prepend_newline); + prepend_newline = false; + } + + // If the msg is not from an agent (not yourself though), + // extract out the sender name and replace it with the hotlinked name. + if (chat.mSourceType == CHAT_SOURCE_AGENT && + chat.mFromID != LLUUID::null && + (line.length() > chat.mFromName.length() && line.find(chat.mFromName,0) == 0)) + { +//MK + if (!RRenabled || !gAgent.mRRInterface.mContainsShownames) + { +//mk + std::string start_line = line.substr(0, chat.mFromName.length() + 1); + line = line.substr(chat.mFromName.length() + 1); + const LLStyleSP &sourceStyle = LLStyleMap::instance().lookup(chat.mFromID); + edit->appendStyledText(start_line, false, prepend_newline, &sourceStyle); + prepend_newline = false; +//MK + } +//mk + } + edit->appendColoredText(line, false, prepend_newline, color); +} + +void log_chat_text(const LLChat& chat) +{ + std::string histstr; + if (gSavedPerAccountSettings.getBOOL("LogChatTimestamp")) + histstr = LLLogChat::timestamp(gSavedPerAccountSettings.getBOOL("LogTimestampDate")) + chat.mText; + else + histstr = chat.mText; + + LLLogChat::saveHistory(std::string("chat"),histstr); +} +// static +void LLFloaterChat::addChatHistory(const LLChat& chat, bool log_to_file) +{ + if ( gSavedPerAccountSettings.getBOOL("LogChat") && log_to_file) + { + log_chat_text(chat); + } + + LLColor4 color = get_text_color(chat); + + if (!log_to_file) color = LLColor4::grey; //Recap from log file. + + if (chat.mChatType == CHAT_TYPE_DEBUG_MSG) + { + LLFloaterScriptDebug::addScriptLine(chat.mText, + chat.mFromName, + color, + chat.mFromID); + if (!gSavedSettings.getBOOL("ScriptErrorsAsChat")) + { + return; + } + } + + // could flash the chat button in the status bar here. JC + LLFloaterChat* chat_floater = LLFloaterChat::getInstance(LLSD()); + LLViewerTextEditor* history_editor = chat_floater->getChild("Chat History Editor"); + LLViewerTextEditor* history_editor_with_mute = chat_floater->getChild("Chat History Editor with mute"); + + history_editor->setParseHTML(TRUE); + history_editor_with_mute->setParseHTML(TRUE); + + if (!chat.mMuted) + { + add_timestamped_line(history_editor, chat, color); + add_timestamped_line(history_editor_with_mute, chat, color); + } + else + { + // desaturate muted chat + LLColor4 muted_color = lerp(color, LLColor4::grey, 0.5f); + add_timestamped_line(history_editor_with_mute, chat, color); + } + + // add objects as transient speakers that can be muted + if (chat.mSourceType == CHAT_SOURCE_OBJECT) + { + chat_floater->mPanel->setSpeaker(chat.mFromID, chat.mFromName, LLSpeaker::STATUS_NOT_IN_CHANNEL, LLSpeaker::SPEAKER_OBJECT); + } + + // start tab flashing on incoming text from other users (ignoring system text, etc) + if (!chat_floater->isInVisibleChain() && chat.mSourceType == CHAT_SOURCE_AGENT) + { + LLFloaterChatterBox::getInstance()->setFloaterFlashing(chat_floater, TRUE); + } +} + +// static +void LLFloaterChat::setHistoryCursorAndScrollToEnd() +{ + LLViewerTextEditor* history_editor = LLFloaterChat::getInstance(LLSD())->getChild("Chat History Editor"); + LLViewerTextEditor* history_editor_with_mute = LLFloaterChat::getInstance(LLSD())->getChild("Chat History Editor with mute"); + + if (history_editor) + { + history_editor->setCursorAndScrollToEnd(); + } + if (history_editor_with_mute) + { + history_editor_with_mute->setCursorAndScrollToEnd(); + } +} + + +//static +void LLFloaterChat::onClickMute(void *data) +{ + LLFloaterChat* self = (LLFloaterChat*)data; + + LLComboBox* chatter_combo = self->getChild("chatter combobox"); + + const std::string& name = chatter_combo->getSimple(); + LLUUID id = chatter_combo->getCurrentID(); + + if (name.empty()) return; + + LLMute mute(id); + mute.setFromDisplayName(name); + LLMuteList::getInstance()->add(mute); + + LLFloaterMute::showInstance(); +} + +//static +void LLFloaterChat::onClickToggleShowMute(LLUICtrl* caller, void *data) +{ + LLFloaterChat* floater = (LLFloaterChat*)data; + + + //LLCheckBoxCtrl* + BOOL show_mute = floater->getChild("show mutes")->get(); + LLViewerTextEditor* history_editor = floater->getChild("Chat History Editor"); + LLViewerTextEditor* history_editor_with_mute = floater->getChild("Chat History Editor with mute"); + + if (!history_editor || !history_editor_with_mute) + return; + + //BOOL show_mute = floater->mShowMuteCheckBox->get(); + if (show_mute) + { + history_editor->setVisible(FALSE); + history_editor_with_mute->setVisible(TRUE); + history_editor_with_mute->setCursorAndScrollToEnd(); + } + else + { + history_editor->setVisible(TRUE); + history_editor_with_mute->setVisible(FALSE); + history_editor->setCursorAndScrollToEnd(); + } +} + +// Put a line of chat in all the right places +void LLFloaterChat::addChat(const LLChat& chat, + BOOL from_instant_message, + BOOL local_agent) +{ + LLColor4 text_color = get_text_color(chat); + + BOOL invisible_script_debug_chat = + chat.mChatType == CHAT_TYPE_DEBUG_MSG + && !gSavedSettings.getBOOL("ScriptErrorsAsChat"); + +#if LL_LCD_COMPILE + // add into LCD displays + if (!invisible_script_debug_chat) + { + if (!from_instant_message) + { + AddNewChatToLCD(chat.mText); + } + else + { + AddNewIMToLCD(chat.mText); + } + } +#endif + if (!invisible_script_debug_chat + && !chat.mMuted + && gConsole + && !local_agent) + { + F32 size = CHAT_MSG_SIZE; + if (chat.mSourceType == CHAT_SOURCE_SYSTEM) + { + text_color = gSavedSettings.getColor("SystemChatColor"); + } + else if(from_instant_message) + { + text_color = gSavedSettings.getColor("IMChatColor"); + size = INSTANT_MSG_SIZE; + } + gConsole->addLine(chat.mText, size, text_color); + } + + if(from_instant_message && gSavedPerAccountSettings.getBOOL("LogChatIM")) + log_chat_text(chat); + + if(from_instant_message && gSavedSettings.getBOOL("IMInChatHistory")) + addChatHistory(chat,false); + + if(!from_instant_message) + addChatHistory(chat); +} + +LLColor4 get_text_color(const LLChat& chat) +{ + LLColor4 text_color; + + if(chat.mMuted) + { + text_color.setVec(0.8f, 0.8f, 0.8f, 1.f); + } + else + { + switch(chat.mSourceType) + { + case CHAT_SOURCE_SYSTEM: + text_color = gSavedSettings.getColor4("SystemChatColor"); + break; + case CHAT_SOURCE_AGENT: + if (chat.mFromID.isNull()) + { + text_color = gSavedSettings.getColor4("SystemChatColor"); + } + else + { + if(gAgent.getID() == chat.mFromID) + { + text_color = gSavedSettings.getColor4("UserChatColor"); + } + else + { + text_color = gSavedSettings.getColor4("AgentChatColor"); + } + } + break; + case CHAT_SOURCE_OBJECT: + if (chat.mChatType == CHAT_TYPE_DEBUG_MSG) + { + text_color = gSavedSettings.getColor4("ScriptErrorColor"); + } + else if ( chat.mChatType == CHAT_TYPE_OWNER ) + { + text_color = gSavedSettings.getColor4("llOwnerSayChatColor"); + } + else + { + text_color = gSavedSettings.getColor4("ObjectChatColor"); + } + break; + default: + text_color.setToWhite(); + } + + if (!chat.mPosAgent.isExactlyZero()) + { + LLVector3 pos_agent = gAgent.getPositionAgent(); + F32 distance = dist_vec(pos_agent, chat.mPosAgent); + if (distance > gAgent.getNearChatRadius()) + { + // diminish far-off chat + text_color.mV[VALPHA] = 0.8f; + } + } + } + + return text_color; +} + +//static +void LLFloaterChat::loadHistory() +{ + LLLogChat::loadHistory(std::string("chat"), &chatFromLogFile, (void *)LLFloaterChat::getInstance(LLSD())); +} + +//static +void LLFloaterChat::chatFromLogFile(LLLogChat::ELogLineType type , std::string line, void* userdata) +{ + switch (type) + { + case LLLogChat::LOG_EMPTY: + case LLLogChat::LOG_END: + // *TODO: nice message from XML file here + break; + case LLLogChat::LOG_LINE: + { + LLChat chat; + chat.mText = line; + addChatHistory(chat, FALSE); + } + break; + default: + // nothing + break; + } +} + +//static +void* LLFloaterChat::createSpeakersPanel(void* data) +{ + return new LLPanelActiveSpeakers(LLLocalSpeakerMgr::getInstance(), TRUE); +} + +//static +void* LLFloaterChat::createChatPanel(void* data) +{ + LLChatBar* chatp = new LLChatBar(); + return chatp; +} + +// static +void LLFloaterChat::onClickToggleActiveSpeakers(void* userdata) +{ + LLFloaterChat* self = (LLFloaterChat*)userdata; +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + if (!self->childIsVisible("active_speakers_panel")) return; + } +//mk + self->childSetVisible("active_speakers_panel", !self->childIsVisible("active_speakers_panel")); +} + +//static +bool LLFloaterChat::visible(LLFloater* instance, const LLSD& key) +{ + return VisibilityPolicy::visible(instance, key); +} + +//static +void LLFloaterChat::show(LLFloater* instance, const LLSD& key) +{ + VisibilityPolicy::show(instance, key); +} + +//static +void LLFloaterChat::hide(LLFloater* instance, const LLSD& key) +{ + if(instance->getHost()) + { + LLFloaterChatterBox::hideInstance(); + } + else + { + VisibilityPolicy::hide(instance, key); + } +} diff --git a/linden/indra/newview/llfloaterchatterbox.cpp b/linden/indra/newview/llfloaterchatterbox.cpp index 036c7c4..64aed9a 100644 --- a/linden/indra/newview/llfloaterchatterbox.cpp +++ b/linden/indra/newview/llfloaterchatterbox.cpp @@ -43,48 +43,6 @@ #include "llimview.h" #include "llimpanel.h" -// -// LLFloaterMyFriends -// - -LLFloaterMyFriends::LLFloaterMyFriends(const LLSD& seed) -{ - mFactoryMap["friends_panel"] = LLCallbackMap(LLFloaterMyFriends::createFriendsPanel, NULL); - mFactoryMap["groups_panel"] = LLCallbackMap(LLFloaterMyFriends::createGroupsPanel, NULL); - // do not automatically open singleton floaters (as result of getInstance()) - BOOL no_open = FALSE; - LLUICtrlFactory::getInstance()->buildFloater(this, "floater_my_friends.xml", &getFactoryMap(), no_open); -} - -LLFloaterMyFriends::~LLFloaterMyFriends() -{ -} - -BOOL LLFloaterMyFriends::postBuild() -{ - mTabs = getChild("friends_and_groups"); - - return TRUE; -} - - -void LLFloaterMyFriends::onClose(bool app_quitting) -{ - setVisible(FALSE); -} - -//static -void* LLFloaterMyFriends::createFriendsPanel(void* data) -{ - return new LLPanelFriends(); -} - -//static -void* LLFloaterMyFriends::createGroupsPanel(void* data) -{ - return new LLPanelGroups(); -} - // // LLFloaterChatterBox // @@ -94,19 +52,12 @@ LLFloaterChatterBox::LLFloaterChatterBox(const LLSD& seed) : mAutoResize = FALSE; LLUICtrlFactory::getInstance()->buildFloater(this, "floater_chatterbox.xml", NULL, FALSE); - if (gSavedSettings.getBOOL("ContactsTornOff")) - { - LLFloaterMyFriends* floater_contacts = LLFloaterMyFriends::getInstance(0); - // add then remove to set up relationship for re-attach - addFloater(floater_contacts, FALSE); - removeFloater(floater_contacts); - // reparent to floater view - gFloaterView->addChild(floater_contacts); - } - else - { - addFloater(LLFloaterMyFriends::getInstance(0), TRUE); - } + addFloater(mFloaterNewIM = new LLFloaterNewIM(), FALSE); + + // reposition floater from saved settings + LLRect rect = gSavedSettings.getRect( "ChatterboxRect" ); + reshape( rect.getWidth(), rect.getHeight(), FALSE ); + setRect( rect ); if (gSavedSettings.getBOOL("ChatHistoryTornOff")) { @@ -219,20 +170,10 @@ void LLFloaterChatterBox::setMinimized(BOOL minimized) void LLFloaterChatterBox::removeFloater(LLFloater* floaterp) { - if (floaterp->getName() == "chat floater") - { - // only my friends floater now locked - mTabContainer->lockTabs(mTabContainer->getNumLockedTabs() - 1); - gSavedSettings.setBOOL("ChatHistoryTornOff", TRUE); - floaterp->setCanClose(TRUE); - } - else if (floaterp->getName() == "floater_my_friends") - { - // only chat floater now locked - mTabContainer->lockTabs(mTabContainer->getNumLockedTabs() - 1); - gSavedSettings.setBOOL("ContactsTornOff", TRUE); - floaterp->setCanClose(TRUE); - } + // only my friends floater now locked + mTabContainer->lockTabs(mTabContainer->getNumLockedTabs() - 1); + gSavedSettings.setBOOL("ChatHistoryTornOff", TRUE); + floaterp->setCanClose(TRUE); LLMultiFloater::removeFloater(floaterp); } @@ -250,33 +191,13 @@ void LLFloaterChatterBox::addFloater(LLFloater* floaterp, { mTabContainer->unlockTabs(); // add chat history as second tab if contact window is present, first tab otherwise - if (getChildView("floater_my_friends")) - { - // assuming contacts window is first tab, select it - mTabContainer->selectFirstTab(); - // and add ourselves after - LLMultiFloater::addFloater(floaterp, select_added_floater, LLTabContainer::RIGHT_OF_CURRENT); - } - else - { - LLMultiFloater::addFloater(floaterp, select_added_floater, LLTabContainer::START); - } + LLMultiFloater::addFloater(floaterp, select_added_floater, LLTabContainer::START); // make sure first two tabs are now locked mTabContainer->lockTabs(num_locked_tabs + 1); gSavedSettings.setBOOL("ChatHistoryTornOff", FALSE); floaterp->setCanClose(FALSE); } - else if (floaterp->getName() == "floater_my_friends") - { - mTabContainer->unlockTabs(); - // add contacts window as first tab - LLMultiFloater::addFloater(floaterp, select_added_floater, LLTabContainer::START); - // make sure first two tabs are now locked - mTabContainer->lockTabs(num_locked_tabs + 1); - gSavedSettings.setBOOL("ContactsTornOff", FALSE); - floaterp->setCanClose(FALSE); - } else { LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point); diff --git a/linden/indra/newview/llfloaterchatterbox.h b/linden/indra/newview/llfloaterchatterbox.h index 57f07a0..d921c8d 100644 --- a/linden/indra/newview/llfloaterchatterbox.h +++ b/linden/indra/newview/llfloaterchatterbox.h @@ -38,6 +38,7 @@ #include "llstring.h" #include "llimview.h" #include "llimpanel.h" +#include "llfloaternewim.h" class LLTabContainer; @@ -58,6 +59,8 @@ class LLFloaterChatterBox : public LLMultiFloater, public LLUISingleton -{ -public: - LLFloaterMyFriends(const LLSD& seed); - virtual ~LLFloaterMyFriends(); - - virtual BOOL postBuild(); - - void onClose(bool app_quitting); - - static void* createFriendsPanel(void* data); - static void* createGroupsPanel(void* data); - - // visibility policy for LLUISingleton - static bool visible(LLFloater* instance, const LLSD& key) - { - LLFloaterMyFriends* floaterp = (LLFloaterMyFriends*)instance; - return floaterp->isInVisibleChain() && floaterp->mTabs->getCurrentPanelIndex() == key.asInteger(); - } - - static void show(LLFloater* instance, const LLSD& key) - { - VisibilityPolicy::show(instance, key); - // garbage values in id will be interpreted as 0, or the friends tab - ((LLFloaterMyFriends*)instance)->mTabs->selectTab(key); - } - - static void hide(LLFloater* instance, const LLSD& key) - { - if (visible(instance, key)) - { - LLFloaterChatterBox::hideInstance(); - } - } - -protected: - LLTabContainer* mTabs; + LLFloaterNewIM* mFloaterNewIM; }; #endif // LL_LLFLOATERCHATTERBOX_H diff --git a/linden/indra/newview/llfloaterfriends.cpp b/linden/indra/newview/llfloaterfriends.cpp index 1402b2c..fee9769 100644 --- a/linden/indra/newview/llfloaterfriends.cpp +++ b/linden/indra/newview/llfloaterfriends.cpp @@ -71,7 +71,7 @@ class LLLocalFriendsObserver : public LLFriendObserver, public LLEventTimer { public: - LLLocalFriendsObserver(LLPanelFriends* floater) : mFloater(floater), LLEventTimer(OBSERVER_TIMEOUT) + LLLocalFriendsObserver(LLFloaterFriends* floater) : mFloater(floater), LLEventTimer(OBSERVER_TIMEOUT) { mEventTimer.stop(); } @@ -99,34 +99,42 @@ class LLLocalFriendsObserver : public LLFriendObserver, public LLEventTimer } protected: - LLPanelFriends* mFloater; + LLFloaterFriends* mFloater; U32 mMask; }; -LLPanelFriends::LLPanelFriends() : - LLPanel(), +LLFloaterFriends* LLFloaterFriends::sInstance = NULL; + +LLFloaterFriends::LLFloaterFriends() : + LLFloater(), LLEventTimer(DEFAULT_PERIOD), mObserver(NULL), mShowMaxSelectWarning(TRUE), mAllowRightsChange(TRUE), mNumRightsChanged(0) { + sInstance = this; mEventTimer.stop(); mObserver = new LLLocalFriendsObserver(this); LLAvatarTracker::instance().addObserver(mObserver); // For notification when SIP online status changes. LLVoiceClient::getInstance()->addObserver(mObserver); + gSavedSettings.setBOOL("ShowFriends", TRUE); + LLUICtrlFactory::getInstance()->buildFloater(this, "floater_friends.xml"); + refreshUI(); } -LLPanelFriends::~LLPanelFriends() +LLFloaterFriends::~LLFloaterFriends() { // For notification when SIP online status changes. LLVoiceClient::getInstance()->removeObserver(mObserver); LLAvatarTracker::instance().removeObserver(mObserver); delete mObserver; + sInstance = NULL; + gSavedSettings.setBOOL("ShowFriends", FALSE); } -BOOL LLPanelFriends::tick() +BOOL LLFloaterFriends::tick() { mEventTimer.stop(); mPeriod = DEFAULT_PERIOD; @@ -135,19 +143,56 @@ BOOL LLPanelFriends::tick() return FALSE; } -void LLPanelFriends::updateFriends(U32 changed_mask) +// static +void LLFloaterFriends::show(void*) +{ + if(sInstance) + { + sInstance->open(); /*Flawfinder: ignore*/ + } + else + { + LLFloaterFriends* self = new LLFloaterFriends; + self->open(); /*Flawfinder: ignore*/ + } +} + + +// static +BOOL LLFloaterFriends::visible(void*) +{ + return sInstance && sInstance->getVisible(); +} + + +// static +void LLFloaterFriends::toggle(void*) { + if (sInstance) + { + sInstance->close(); + } + else + { + show(); + } +} + + +void LLFloaterFriends::updateFriends(U32 changed_mask) +{ + if (!sInstance) return; LLUUID selected_id; - LLCtrlListInterface *friends_list = childGetListInterface("friend_list"); + LLCtrlListInterface *friends_list = sInstance->childGetListInterface("friend_list"); if (!friends_list) return; - LLCtrlScrollInterface *friends_scroll = childGetScrollInterface("friend_list"); + LLCtrlScrollInterface *friends_scroll = sInstance->childGetScrollInterface("friend_list"); if (!friends_scroll) return; // We kill the selection warning, otherwise we'll spam with warning popups // if the maximum amount of friends are selected mShowMaxSelectWarning = false; - LLDynamicArray selected_friends = getSelectedIDs(); + LLDynamicArray selected_friends = sInstance->getSelectedIDs(); if(changed_mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::ONLINE)) { refreshNames(changed_mask); @@ -183,7 +228,7 @@ void LLPanelFriends::updateFriends(U32 changed_mask) } // virtual -BOOL LLPanelFriends::postBuild() +BOOL LLFloaterFriends::postBuild() { mFriendsList = getChild("friend_list"); mFriendsList->setMaxSelectable(MAX_FRIEND_SELECT); @@ -201,6 +246,7 @@ BOOL LLPanelFriends::postBuild() childSetAction("pay_btn", onClickPay, this); childSetAction("add_btn", onClickAddFriend, this); childSetAction("remove_btn", onClickRemove, this); + childSetAction("close_btn", onClickClose, this); setDefaultBtn("im_btn"); @@ -214,8 +260,9 @@ BOOL LLPanelFriends::postBuild() return TRUE; } -BOOL LLPanelFriends::addFriend(const LLUUID& agent_id) +BOOL LLFloaterFriends::addFriend(const LLUUID& agent_id) { + if (!sInstance) return FALSE; LLAvatarTracker& at = LLAvatarTracker::instance(); const LLRelationship* relationInfo = at.getBuddyInfo(agent_id); if(!relationInfo) return FALSE; @@ -266,9 +313,12 @@ BOOL LLPanelFriends::addFriend(const LLUUID& agent_id) LLSD& edit_their_object_column = element["columns"][LIST_EDIT_THEIRS]; edit_their_object_column["column"] = "icon_edit_theirs"; - edit_their_object_column["type"] = "checkbox"; - edit_their_object_column["enabled"] = ""; - edit_their_object_column["value"] = relationInfo->isRightGrantedFrom(LLRelationship::GRANT_MODIFY_OBJECTS); + edit_their_object_column["type"] = "text"; + if(relationInfo->isRightGrantedFrom(LLRelationship::GRANT_MODIFY_OBJECTS)) + { + edit_their_object_column["type"] = "icon"; + edit_their_object_column["value"] = "ff_edit_theirs.tga"; + } LLSD& update_gen_column = element["columns"][LIST_FRIEND_UPDATE_GEN]; update_gen_column["column"] = "friend_last_update_generation"; @@ -280,8 +330,9 @@ BOOL LLPanelFriends::addFriend(const LLUUID& agent_id) // propagate actual relationship to UI. // Does not resort the UI list because it can be called frequently. JC -BOOL LLPanelFriends::updateFriendItem(const LLUUID& agent_id, const LLRelationship* info) +BOOL LLFloaterFriends::updateFriendItem(const LLUUID& agent_id, const LLRelationship* info) { + if (!sInstance) return FALSE; if (!info) return FALSE; LLScrollListItem* itemp = mFriendsList->getItem(agent_id); if (!itemp) return FALSE; @@ -322,8 +373,9 @@ BOOL LLPanelFriends::updateFriendItem(const LLUUID& agent_id, const LLRelationsh return have_name; } -void LLPanelFriends::refreshRightsChangeList() +void LLFloaterFriends::refreshRightsChangeList() { + if (!sInstance) return; LLDynamicArray friends = getSelectedIDs(); S32 num_selected = friends.size(); @@ -388,8 +440,9 @@ struct SortFriendsByID } }; -void LLPanelFriends::refreshNames(U32 changed_mask) +void LLFloaterFriends::refreshNames(U32 changed_mask) { + if (!sInstance) return; LLDynamicArray selected_ids = getSelectedIDs(); S32 pos = mFriendsList->getScrollPos(); @@ -423,7 +476,7 @@ void LLPanelFriends::refreshNames(U32 changed_mask) mFriendsList->setScrollPos(pos); } -BOOL LLPanelFriends::refreshNamesSync(const LLAvatarTracker::buddy_map_t & all_buddies) +BOOL LLFloaterFriends::refreshNamesSync(const LLAvatarTracker::buddy_map_t & all_buddies) { mFriendsList->deleteAllItems(); @@ -438,7 +491,7 @@ BOOL LLPanelFriends::refreshNamesSync(const LLAvatarTracker::buddy_map_t & all_b return have_names; } -BOOL LLPanelFriends::refreshNamesPresence(const LLAvatarTracker::buddy_map_t & all_buddies) +BOOL LLFloaterFriends::refreshNamesPresence(const LLAvatarTracker::buddy_map_t & all_buddies) { std::vector items = mFriendsList->getAllData(); std::sort(items.begin(), items.end(), SortFriendsByID()); @@ -488,70 +541,54 @@ BOOL LLPanelFriends::refreshNamesPresence(const LLAvatarTracker::buddy_map_t & a return have_names; } -void LLPanelFriends::refreshUI() +void LLFloaterFriends::refreshUI() { - BOOL single_selected = FALSE; - BOOL multiple_selected = FALSE; + if (!sInstance) return; int num_selected = mFriendsList->getAllSelected().size(); - if(num_selected > 0) - { - single_selected = TRUE; - if(num_selected > 1) - { - childSetText("friend_name_label", getString("Multiple")); - multiple_selected = TRUE; - } - else - { - childSetText("friend_name_label", mFriendsList->getFirstSelected()->getColumn(LIST_FRIEND_NAME)->getValue().asString() + "..."); - } - } - else - { - childSetText("friend_name_label", LLStringUtil::null); - } - + BOOL single_selected = (num_selected == 1); + BOOL some_selected = (num_selected > 0); //Options that can only be performed with one friend selected - childSetEnabled("profile_btn", single_selected && !multiple_selected); - childSetEnabled("pay_btn", single_selected && !multiple_selected); + childSetEnabled("profile_btn", single_selected); + childSetEnabled("pay_btn", single_selected); //Options that can be performed with up to MAX_FRIEND_SELECT friends selected - //(single_selected will always be true in this situations) - childSetEnabled("remove_btn", single_selected); - childSetEnabled("im_btn", single_selected); - childSetEnabled("friend_rights", single_selected); + childSetEnabled("remove_btn", some_selected); + childSetEnabled("im_btn", some_selected); + childSetEnabled("friend_rights", some_selected); refreshRightsChangeList(); } -LLDynamicArray LLPanelFriends::getSelectedIDs() +// static +LLDynamicArray LLFloaterFriends::getSelectedIDs() { LLUUID selected_id; LLDynamicArray friend_ids; - std::vector selected = mFriendsList->getAllSelected(); - for(std::vector::iterator itr = selected.begin(); itr != selected.end(); ++itr) + if(sInstance) { - friend_ids.push_back((*itr)->getUUID()); + std::vector selected = sInstance->mFriendsList->getAllSelected(); + for(std::vector::iterator itr = selected.begin(); itr != selected.end(); ++itr) + { + friend_ids.push_back((*itr)->getUUID()); + } } return friend_ids; } // static -void LLPanelFriends::onSelectName(LLUICtrl* ctrl, void* user_data) +void LLFloaterFriends::onSelectName(LLUICtrl* ctrl, void* user_data) { - LLPanelFriends* panelp = (LLPanelFriends*)user_data; - - if(panelp) + if(sInstance) { - panelp->refreshUI(); + sInstance->refreshUI(); // check to see if rights have changed - panelp->applyRightsToFriends(); + sInstance->applyRightsToFriends(); } } //static -void LLPanelFriends::onMaximumSelect(void* user_data) +void LLFloaterFriends::onMaximumSelect(void* user_data) { LLStringUtil::format_map_t args; args["[MAX_SELECT]"] = llformat("%d", MAX_FRIEND_SELECT); @@ -559,12 +596,10 @@ void LLPanelFriends::onMaximumSelect(void* user_data) }; // static -void LLPanelFriends::onClickProfile(void* user_data) +void LLFloaterFriends::onClickProfile(void* user_data) { - LLPanelFriends* panelp = (LLPanelFriends*)user_data; - - //llinfos << "LLPanelFriends::onClickProfile()" << llendl; - LLDynamicArray ids = panelp->getSelectedIDs(); + //llinfos << "LLFloaterFriends::onClickProfile()" << llendl; + LLDynamicArray ids = sInstance->getSelectedIDs(); if(ids.size() > 0) { LLUUID agent_id = ids[0]; @@ -575,12 +610,10 @@ void LLPanelFriends::onClickProfile(void* user_data) } // static -void LLPanelFriends::onClickIM(void* user_data) +void LLFloaterFriends::onClickIM(void* user_data) { - LLPanelFriends* panelp = (LLPanelFriends*)user_data; - - //llinfos << "LLPanelFriends::onClickIM()" << llendl; - LLDynamicArray ids = panelp->getSelectedIDs(); + //llinfos << "LLFloaterFriends::onClickIM()" << llendl; + LLDynamicArray ids = sInstance->getSelectedIDs(); if(ids.size() > 0) { if(ids.size() == 1) @@ -604,7 +637,7 @@ void LLPanelFriends::onClickIM(void* user_data) } // static -void LLPanelFriends::requestFriendship(const LLUUID& target_id, const std::string& target_name, const std::string& message) +void LLFloaterFriends::requestFriendship(const LLUUID& target_id, const std::string& target_name, const std::string& message) { LLUUID calling_card_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); send_improved_im(target_id, @@ -622,7 +655,7 @@ struct LLAddFriendData }; // static -void LLPanelFriends::callbackAddFriendWithMessage(S32 option, const std::string& text, void* data) +void LLFloaterFriends::callbackAddFriendWithMessage(S32 option, const std::string& text, void* data) { LLAddFriendData* add = (LLAddFriendData*)data; if (option == 0) @@ -633,7 +666,7 @@ void LLPanelFriends::callbackAddFriendWithMessage(S32 option, const std::string& } // static -void LLPanelFriends::callbackAddFriend(S32 option, void* data) +void LLFloaterFriends::callbackAddFriend(S32 option, void* data) { LLAddFriendData* add = (LLAddFriendData*)data; if (option == 0) @@ -649,7 +682,7 @@ void LLPanelFriends::callbackAddFriend(S32 option, void* data) } // static -void LLPanelFriends::onPickAvatar(const std::vector& names, +void LLFloaterFriends::onPickAvatar(const std::vector& names, const std::vector& ids, void* ) { @@ -659,7 +692,7 @@ void LLPanelFriends::onPickAvatar(const std::vector& names, } // static -void LLPanelFriends::requestFriendshipDialog(const LLUUID& id, +void LLFloaterFriends::requestFriendshipDialog(const LLUUID& id, const std::string& name) { if(id == gAgentID) @@ -689,24 +722,20 @@ void LLPanelFriends::requestFriendshipDialog(const LLUUID& id, } // static -void LLPanelFriends::onClickAddFriend(void* user_data) +void LLFloaterFriends::onClickAddFriend(void* user_data) { - LLPanelFriends* panelp = (LLPanelFriends*)user_data; - LLFloater* root_floater = gFloaterView->getParentFloater(panelp); LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(onPickAvatar, user_data, FALSE, TRUE); - if (root_floater) + if (sInstance) { - root_floater->addDependentFloater(picker); + sInstance->addDependentFloater(picker); } } // static -void LLPanelFriends::onClickRemove(void* user_data) +void LLFloaterFriends::onClickRemove(void* user_data) { - LLPanelFriends* panelp = (LLPanelFriends*)user_data; - - //llinfos << "LLPanelFriends::onClickRemove()" << llendl; - LLDynamicArray ids = panelp->getSelectedIDs(); + //llinfos << "LLFloaterFriends::onClickRemove()" << llendl; + LLDynamicArray ids = sInstance->getSelectedIDs(); LLStringUtil::format_map_t args; if(ids.size() > 0) { @@ -733,11 +762,9 @@ void LLPanelFriends::onClickRemove(void* user_data) } // static -void LLPanelFriends::onClickOfferTeleport(void* user_data) +void LLFloaterFriends::onClickOfferTeleport(void* user_data) { - LLPanelFriends* panelp = (LLPanelFriends*)user_data; - - LLDynamicArray ids = panelp->getSelectedIDs(); + LLDynamicArray ids = sInstance->getSelectedIDs(); if(ids.size() > 0) { handle_lure(ids); @@ -745,18 +772,26 @@ void LLPanelFriends::onClickOfferTeleport(void* user_data) } // static -void LLPanelFriends::onClickPay(void* user_data) +void LLFloaterFriends::onClickPay(void* user_data) { - LLPanelFriends* panelp = (LLPanelFriends*)user_data; - - LLDynamicArray ids = panelp->getSelectedIDs(); + LLDynamicArray ids = sInstance->getSelectedIDs(); if(ids.size() == 1) { handle_pay_by_id(ids[0]); } } -void LLPanelFriends::confirmModifyRights(rights_map_t& ids, EGrantRevoke command) +// static +void LLFloaterFriends::onClickClose(void* user_data) +{ + //llinfos << "LLFloaterFriends::onClickClose()" << llendl; + if(sInstance) + { + sInstance->onClose(false); + } +} + +void LLFloaterFriends::confirmModifyRights(rights_map_t& ids, EGrantRevoke command) { if (ids.empty()) return; @@ -766,7 +801,7 @@ void LLPanelFriends::confirmModifyRights(rights_map_t& ids, EGrantRevoke command // copy map of ids onto heap rights_map_t* rights = new rights_map_t(ids); // package with panel pointer - std::pair* user_data = new std::pair(this, rights); + std::pair* user_data = new std::pair(this, rights); // for single friend, show their name if(ids.size() == 1) @@ -802,10 +837,10 @@ void LLPanelFriends::confirmModifyRights(rights_map_t& ids, EGrantRevoke command } // static -void LLPanelFriends::modifyRightsConfirmation(S32 option, void* user_data) +void LLFloaterFriends::modifyRightsConfirmation(S32 option, void* user_data) { - std::pair* data = (std::pair*)user_data; - LLPanelFriends* panelp = data->first; + std::pair* data = (std::pair*)user_data; + LLFloaterFriends* panelp = data->first; if(panelp) { @@ -833,8 +868,9 @@ void LLPanelFriends::modifyRightsConfirmation(S32 option, void* user_data) delete data; } -void LLPanelFriends::applyRightsToFriends() +void LLFloaterFriends::applyRightsToFriends() { + if (!sInstance) return; BOOL rights_changed = FALSE; // store modify rights separately for confirmation @@ -926,7 +962,7 @@ void LLPanelFriends::applyRightsToFriends() } } -void LLPanelFriends::sendRightsGrant(rights_map_t& ids) +void LLFloaterFriends::sendRightsGrant(rights_map_t& ids) { if (ids.empty()) return; @@ -954,7 +990,7 @@ void LLPanelFriends::sendRightsGrant(rights_map_t& ids) // static -void LLPanelFriends::handleRemove(S32 option, void* user_data) +void LLFloaterFriends::handleRemove(S32 option, void* user_data) { LLDynamicArray* ids = static_cast*>(user_data); for(LLDynamicArray::iterator itr = ids->begin(); itr != ids->end(); ++itr) diff --git a/linden/indra/newview/llfloaterfriends.h b/linden/indra/newview/llfloaterfriends.h index 64f39bf..0ca7bfb 100644 --- a/linden/indra/newview/llfloaterfriends.h +++ b/linden/indra/newview/llfloaterfriends.h @@ -34,7 +34,7 @@ #ifndef LL_LLFLOATERFRIENDS_H #define LL_LLFLOATERFRIENDS_H -#include "llpanel.h" +#include "llfloater.h" #include "llstring.h" #include "lluuid.h" #include "lltimer.h" @@ -46,23 +46,31 @@ class LLScrollListItem; class LLScrollListCtrl; /** - * @class LLPanelFriends + * @class LLFloaterFriends * @brief An instance of this class is used for displaying your friends * and gives you quick access to all agents which a user relationship. * * @sa LLFloater */ -class LLPanelFriends : public LLPanel, public LLEventTimer +class LLFloaterFriends : public LLFloater, public LLEventTimer { public: - LLPanelFriends(); - virtual ~LLPanelFriends(); + LLFloaterFriends(); + virtual ~LLFloaterFriends(); /** * @brief This method either creates or brings to the front the * current instantiation of this floater. There is only once since * you can currently only look at your local friends. */ + static void show(void* ignored = NULL); + + // Toggles visibility of floater + static void toggle(void* unused = NULL); + + // Tells if the floater is visible + static BOOL visible(void* unused = NULL); + virtual BOOL tick(); /** @@ -137,7 +145,12 @@ class LLPanelFriends : public LLPanel, public LLEventTimer static void handleRemove(S32 option, void* user_data); static void modifyRightsConfirmation(S32 option, void* user_data); + static void onClickClose(void* user_data); + private: + // static data + static LLFloaterFriends* sInstance; + // member data LLFriendObserver* mObserver; LLUUID mAddFriendID; diff --git a/linden/indra/newview/llfloatergodtools.cpp b/linden/indra/newview/llfloatergodtools.cpp index 7d54ecf..9fb611f 100644 --- a/linden/indra/newview/llfloatergodtools.cpp +++ b/linden/indra/newview/llfloatergodtools.cpp @@ -78,6 +78,10 @@ const F32 SECONDS_BETWEEN_UPDATE_REQUESTS = 5.0f; +//MK +extern BOOL RRenabled; +//mk + static LLFloaterGodTools* sGodTools = NULL; //***************************************************************************** @@ -709,6 +713,16 @@ S32 LLPanelRegionTools::getPricePerMeter() const void LLPanelRegionTools::setSimName(const std::string& name) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + childSetVisible("region name", false); + } + else + { + childSetVisible("region name", true); + } +//mk childSetValue("region name", name); } @@ -1064,6 +1078,16 @@ void LLPanelObjectTools::setTargetAvatar(const LLUUID &target_id) void LLPanelObjectTools::refresh() { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + childSetVisible("region name", false); + } + else + { + childSetVisible("region name", true); + } +//mk LLViewerRegion *regionp = gAgent.getRegion(); if (regionp) { @@ -1349,6 +1373,12 @@ void LLPanelRequestTools::refresh() { LLViewerRegion* regionp = *iter; std::string name = regionp->getName(); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + name = "(Hidden)"; + } +//mk if (!name.empty()) { list->addSimpleElement(name); diff --git a/linden/indra/newview/llfloatergroupinfo.cpp b/linden/indra/newview/llfloatergroupinfo.cpp index 0f54f02..4c479be 100644 --- a/linden/indra/newview/llfloatergroupinfo.cpp +++ b/linden/indra/newview/llfloatergroupinfo.cpp @@ -39,6 +39,7 @@ #include "llcommandhandler.h" #include "llfloaterchatterbox.h" #include "llpanelgroup.h" +#include "llfloatergroups.h" #include "llviewermessage.h" // for inventory_offer_callback //#include "llviewerwindow.h" @@ -79,9 +80,7 @@ class LLGroupHandler : public LLCommandHandler { if (tokens[1].asString() == "show") { - // CP_TODO: get the value we pass in via the XUI name - // of the tab instead of using a literal like this - LLFloaterMyFriends::showInstance( 1 ); + LLFloaterGroups::show(); return true; } diff --git a/linden/indra/newview/llfloatergroups.cpp b/linden/indra/newview/llfloatergroups.cpp index ce97716..94c5787 100644 --- a/linden/indra/newview/llfloatergroups.cpp +++ b/linden/indra/newview/llfloatergroups.cpp @@ -1,6 +1,6 @@ /** * @file llfloatergroups.cpp - * @brief LLPanelGroups class implementation + * @brief LLFloaterGroups class implementation * * $LicenseInfo:firstyear=2002&license=viewergpl$ * @@ -53,6 +53,7 @@ #include "llscrolllistctrl.h" #include "lltextbox.h" #include "lluictrlfactory.h" +#include "llviewercontrol.h" #include "llviewerwindow.h" #include "llimview.h" @@ -161,12 +162,14 @@ void LLFloaterGroupPicker::ok() } ///---------------------------------------------------------------------------- -/// Class LLPanelGroups +/// Class LLFloaterGroups ///---------------------------------------------------------------------------- +LLFloaterGroups* LLFloaterGroups::sInstance = NULL; + //LLEventListener //virtual -bool LLPanelGroups::handleEvent(LLPointer event, const LLSD& userdata) +bool LLFloaterGroups::handleEvent(LLPointer event, const LLSD& userdata) { if (event->desc() == "new group") { @@ -177,20 +180,55 @@ bool LLPanelGroups::handleEvent(LLPointer event, const LLSD& userdata) } // Default constructor -LLPanelGroups::LLPanelGroups() : - LLPanel() +LLFloaterGroups::LLFloaterGroups() : + LLFloater() { + sInstance = this; + LLUICtrlFactory::getInstance()->buildFloater(this, "floater_groups.xml"); gAgent.addListener(this, "new group"); + gSavedSettings.setBOOL("ShowGroups", TRUE); } -LLPanelGroups::~LLPanelGroups() +LLFloaterGroups::~LLFloaterGroups() { gAgent.removeListener(this); + gFocusMgr.releaseFocusIfNeeded(this); + sInstance = NULL; + gSavedSettings.setBOOL("ShowGroups", FALSE); +} + +LLFloaterGroups* LLFloaterGroups::show(void*) +{ + if(sInstance) + { + sInstance->open(); /*Flawfinder: ignore*/ + } + else + { + LLFloaterGroups* self = new LLFloaterGroups; + self->open(); /*Flawfinder: ignore*/ + } + + return sInstance; +} + +// static +void LLFloaterGroups::toggle(void*) +{ + if (sInstance) + { + sInstance->close(); + } + else + { + show(); + } } // clear the group list, and get a fresh set of info. -void LLPanelGroups::reset() +void LLFloaterGroups::reset() { + if (!sInstance) return; LLCtrlListInterface *group_list = childGetListInterface("group list"); if (group_list) { @@ -203,7 +241,7 @@ void LLPanelGroups::reset() enableButtons(); } -BOOL LLPanelGroups::postBuild() +BOOL LLFloaterGroups::postBuild() { childSetCommitCallback("group list", onGroupList, this); @@ -234,7 +272,7 @@ BOOL LLPanelGroups::postBuild() return TRUE; } -void LLPanelGroups::enableButtons() +void LLFloaterGroups::enableButtons() { LLCtrlListInterface *group_list = childGetListInterface("group list"); LLUUID group_id; @@ -273,52 +311,51 @@ void LLPanelGroups::enableButtons() } } - -void LLPanelGroups::onBtnCreate(void* userdata) +void LLFloaterGroups::onBtnCreate(void* userdata) { - LLPanelGroups* self = (LLPanelGroups*)userdata; + LLFloaterGroups* self = (LLFloaterGroups*)userdata; if(self) self->create(); } -void LLPanelGroups::onBtnActivate(void* userdata) +void LLFloaterGroups::onBtnActivate(void* userdata) { - LLPanelGroups* self = (LLPanelGroups*)userdata; + LLFloaterGroups* self = (LLFloaterGroups*)userdata; if(self) self->activate(); } -void LLPanelGroups::onBtnInfo(void* userdata) +void LLFloaterGroups::onBtnInfo(void* userdata) { - LLPanelGroups* self = (LLPanelGroups*)userdata; + LLFloaterGroups* self = (LLFloaterGroups*)userdata; if(self) self->info(); } -void LLPanelGroups::onBtnIM(void* userdata) +void LLFloaterGroups::onBtnIM(void* userdata) { - LLPanelGroups* self = (LLPanelGroups*)userdata; + LLFloaterGroups* self = (LLFloaterGroups*)userdata; if(self) self->startIM(); } -void LLPanelGroups::onBtnLeave(void* userdata) +void LLFloaterGroups::onBtnLeave(void* userdata) { - LLPanelGroups* self = (LLPanelGroups*)userdata; + LLFloaterGroups* self = (LLFloaterGroups*)userdata; if(self) self->leave(); } -void LLPanelGroups::onBtnSearch(void* userdata) +void LLFloaterGroups::onBtnSearch(void* userdata) { - LLPanelGroups* self = (LLPanelGroups*)userdata; + LLFloaterGroups* self = (LLFloaterGroups*)userdata; if(self) self->search(); } -void LLPanelGroups::create() +void LLFloaterGroups::create() { - llinfos << "LLPanelGroups::create" << llendl; + llinfos << "LLFloaterGroups::create" << llendl; LLFloaterGroupInfo::showCreateGroup(NULL); } -void LLPanelGroups::activate() +void LLFloaterGroups::activate() { - llinfos << "LLPanelGroups::activate" << llendl; + llinfos << "LLFloaterGroups::activate" << llendl; LLCtrlListInterface *group_list = childGetListInterface("group list"); LLUUID group_id; if (group_list) @@ -334,9 +371,9 @@ void LLPanelGroups::activate() gAgent.sendReliableMessage(); } -void LLPanelGroups::info() +void LLFloaterGroups::info() { - llinfos << "LLPanelGroups::info" << llendl; + llinfos << "LLFloaterGroups::info" << llendl; LLCtrlListInterface *group_list = childGetListInterface("group list"); LLUUID group_id; if (group_list && (group_id = group_list->getCurrentID()).notNull()) @@ -345,9 +382,8 @@ void LLPanelGroups::info() } } -void LLPanelGroups::startIM() +void LLFloaterGroups::startIM() { - //llinfos << "LLPanelFriends::onClickIM()" << llendl; LLCtrlListInterface *group_list = childGetListInterface("group list"); LLUUID group_id; @@ -372,9 +408,9 @@ void LLPanelGroups::startIM() } } -void LLPanelGroups::leave() +void LLFloaterGroups::leave() { - llinfos << "LLPanelGroups::leave" << llendl; + llinfos << "LLFloaterGroups::leave" << llendl; LLCtrlListInterface *group_list = childGetListInterface("group list"); LLUUID group_id; if (group_list && (group_id = group_list->getCurrentID()).notNull()) @@ -396,13 +432,13 @@ void LLPanelGroups::leave() } } -void LLPanelGroups::search() +void LLFloaterGroups::search() { LLFloaterDirectory::showGroups(); } // static -void LLPanelGroups::callbackLeaveGroup(S32 option, void* userdata) +void LLFloaterGroups::callbackLeaveGroup(S32 option, void* userdata) { LLUUID* group_id = (LLUUID*)userdata; if(option == 0 && group_id) @@ -419,9 +455,9 @@ void LLPanelGroups::callbackLeaveGroup(S32 option, void* userdata) delete group_id; } -void LLPanelGroups::onGroupList(LLUICtrl* ctrl, void* userdata) +void LLFloaterGroups::onGroupList(LLUICtrl* ctrl, void* userdata) { - LLPanelGroups* self = (LLPanelGroups*)userdata; + LLFloaterGroups* self = (LLFloaterGroups*)userdata; if(self) self->enableButtons(); } @@ -476,4 +512,3 @@ void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, U64 pow group_list->selectByValue(highlight_id); } - diff --git a/linden/indra/newview/llfloatergroups.h b/linden/indra/newview/llfloatergroups.h index 000cdfd..d1807dd 100644 --- a/linden/indra/newview/llfloatergroups.h +++ b/linden/indra/newview/llfloatergroups.h @@ -83,15 +83,22 @@ class LLFloaterGroupPicker : public LLFloater, public LLUIFactory event, const LLSD& userdata); - + + // Shows the floater + static LLFloaterGroups* show(void* unused = NULL); + + // Toggles visibility of floater + static void toggle(void* unused = NULL); + // clear the group list, and get a fresh set of info. void reset(); @@ -99,7 +106,6 @@ class LLPanelGroups : public LLPanel, public LLSimpleListener // initialize based on the type BOOL postBuild(); - // highlight_id is a group id to highlight void enableButtons(); static void onGroupList(LLUICtrl* ctrl, void* userdata); @@ -122,6 +128,9 @@ class LLPanelGroups : public LLPanel, public LLSimpleListener static void callbackLeaveGroup(S32 option, void* userdata); +private: + // static data + static LLFloaterGroups* sInstance; }; diff --git a/linden/indra/newview/llfloaterland.cpp b/linden/indra/newview/llfloaterland.cpp index c3b96fc..28caee2 100644 --- a/linden/indra/newview/llfloaterland.cpp +++ b/linden/indra/newview/llfloaterland.cpp @@ -87,6 +87,10 @@ S32 LLFloaterLand::sLastTab = 0; LLHandle LLPanelLandGeneral::sBuyPassDialogHandle; +//MK +extern BOOL RRenabled; +//mk + // Local classes class LLParcelSelectionObserver : public LLParcelObserver { @@ -806,6 +810,12 @@ void LLPanelLandGeneral::setGroup(const LLUUID& group_id) void LLPanelLandGeneral::onClickBuyLand(void* data) { BOOL* for_group = (BOOL*)data; +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + return; + } +//mk LLViewerParcelMgr::getInstance()->startBuyLand(*for_group); } diff --git a/linden/indra/newview/llfloatermap.cpp b/linden/indra/newview/llfloatermap.cpp index b1aa6c7..187b8d1 100644 --- a/linden/indra/newview/llfloatermap.cpp +++ b/linden/indra/newview/llfloatermap.cpp @@ -67,6 +67,10 @@ #include "llglheaders.h" +//MK +extern BOOL RRenabled; +//mk + // // Constants // @@ -214,3 +218,14 @@ void LLFloaterMap::toggle(void*) } } } + +//MK +void LLFloaterMap::open() +{ + if (RRenabled && gAgent.mRRInterface.mContainsShowminimap) + { + return; + } + LLFloater::open(); +} +//mk diff --git a/linden/indra/newview/llfloatermap.h b/linden/indra/newview/llfloatermap.h index 91226dd..1e2051d 100644 --- a/linden/indra/newview/llfloatermap.h +++ b/linden/indra/newview/llfloatermap.h @@ -52,6 +52,9 @@ class LLFloaterMap /*virtual*/ void draw(); /*virtual*/ void onClose(bool app_quitting); /*virtual*/ BOOL canClose(); +//MK + /*virtual*/ void open(); +//mk protected: LLNetMap* mMap; diff --git a/linden/indra/newview/llfloateropenobject.cpp b/linden/indra/newview/llfloateropenobject.cpp index a83b0c9..3352b17 100644 --- a/linden/indra/newview/llfloateropenobject.cpp +++ b/linden/indra/newview/llfloateropenobject.cpp @@ -53,6 +53,9 @@ #include "lluictrlfactory.h" #include "llviewerwindow.h" +//MK +extern BOOL RRenabled; +//mk LLFloaterOpenObject* LLFloaterOpenObject::sInstance = NULL; @@ -207,7 +210,13 @@ void LLFloaterOpenObject::onClickMoveToInventory(void* data) void LLFloaterOpenObject::onClickMoveAndWear(void* data) { LLFloaterOpenObject* self = (LLFloaterOpenObject*)data; - self->moveToInventory(true); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsDetach) { + self->moveToInventory(false); + } else { + self->moveToInventory(true); + } +//mk self->close(); } diff --git a/linden/indra/newview/llfloaterpreference.cpp b/linden/indra/newview/llfloaterpreference.cpp index 353d1be..005ca51 100644 --- a/linden/indra/newview/llfloaterpreference.cpp +++ b/linden/indra/newview/llfloaterpreference.cpp @@ -490,7 +490,6 @@ void LLFloaterPreference::onBtnApply( void* userdata ) void LLFloaterPreference::onClose(bool app_quitting) { LLPanelLogin::setAlwaysRefresh(false); - cancel(); // will be a no-op if OK or apply was performed just prior. LLFloater::onClose(app_quitting); } @@ -507,7 +506,8 @@ void LLFloaterPreference::onBtnCancel( void* userdata ) cur_focus->onCommit(); } } - fp->close(); // side effect will also cancel any unsaved changes. + fp->cancel(); + fp->close(); } diff --git a/linden/indra/newview/llfloaterproperties.cpp b/linden/indra/newview/llfloaterproperties.cpp index d7087f1..595d5fa 100644 --- a/linden/indra/newview/llfloaterproperties.cpp +++ b/linden/indra/newview/llfloaterproperties.cpp @@ -58,6 +58,9 @@ #include "lluictrlfactory.h" +//MK +extern BOOL RRenabled; +//mk //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLPropertiesObserver @@ -354,6 +357,12 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item) else { gCacheName->getFullName(perm.getOwner(), name); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + name = gAgent.mRRInterface.getDummyName (name); + } +//mk } childSetEnabled("BtnOwner",TRUE); childSetEnabled("LabelOwnerTitle",TRUE); @@ -594,6 +603,12 @@ void LLFloaterProperties::onClickCreator(void* data) // static void LLFloaterProperties::onClickOwner(void* data) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + return; + } +//mk LLFloaterProperties* self = (LLFloaterProperties*)data; if(!self) return; LLInventoryItem* item = self->findItem(); diff --git a/linden/indra/newview/llfloaterreporter.cpp b/linden/indra/newview/llfloaterreporter.cpp index 7e9632d..37dce49 100644 --- a/linden/indra/newview/llfloaterreporter.cpp +++ b/linden/indra/newview/llfloaterreporter.cpp @@ -85,6 +85,10 @@ #include "llassetuploadresponders.h" +//MK +extern BOOL RRenabled; +//mk + const U32 INCLUDE_SCREENSHOT = 0x01 << 0; //----------------------------------------------------------------------------- @@ -132,7 +136,17 @@ LLFloaterReporter::LLFloaterReporter( } childSetText("abuse_location_edit", gAgent.getSLURL() ); - +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + childSetVisible("abuse_location_edit", false); + } + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + childSetVisible("owner_name", false); + childSetVisible("abuser_name_edit", false); + } +//mk LLButton* pick_btn = getChild("pick_btn"); if (pick_btn) { @@ -299,7 +313,16 @@ void LLFloaterReporter::getObjectInfo(const LLUUID& object_id) LLViewerRegion *regionp = objectp->getRegion(); if (regionp) { - childSetText("sim_field", regionp->getName()); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + childSetText("sim_field", std::string ("(Region hidden)")); + } + else + { +//mk + childSetText("sim_field", regionp->getName()); + } LLVector3d global_pos; global_pos.setVec(objectp->getPositionRegion()); setPosBox(global_pos); @@ -994,6 +1017,12 @@ void LLFloaterReporter::setPosBox(const LLVector3d &pos) mPosition.mV[VX], mPosition.mV[VY], mPosition.mV[VZ]); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + pos_string = ""; + } +//mk childSetText("pos_field", pos_string); } diff --git a/linden/indra/newview/llfloatersettingsdebug.cpp b/linden/indra/newview/llfloatersettingsdebug.cpp index e440c4a..7806354 100644 --- a/linden/indra/newview/llfloatersettingsdebug.cpp +++ b/linden/indra/newview/llfloatersettingsdebug.cpp @@ -39,6 +39,12 @@ #include "llcolorswatch.h" #include "llviewercontrol.h" +//MK +#include "llagent.h" + +extern BOOL RRenabled; +//mk + LLFloaterSettingsDebug* LLFloaterSettingsDebug::sInstance = NULL; LLFloaterSettingsDebug::LLFloaterSettingsDebug() : LLFloater(std::string("Configuration Editor")) @@ -143,33 +149,106 @@ void LLFloaterSettingsDebug::onCommitSettings(LLUICtrl* ctrl, void* user_data) switch(controlp->type()) { case TYPE_U32: +//MK + // If this debug setting can be changed through RLV and a setdebug restriction is active, ignore the change + if (RRenabled && gAgent.mRRInterface.contains ("setdebug") + && gAgent.mRRInterface.sAllowedU32.find (","+controlp->getName()+",") != -1) + { + return; + } +//mk controlp->set(floaterp->childGetValue("val_spinner_1")); break; case TYPE_S32: +//MK + // If this debug setting can be changed through RLV and a setdebug restriction is active, ignore the change + if (RRenabled && gAgent.mRRInterface.contains ("setdebug") + && gAgent.mRRInterface.sAllowedS32.find (","+controlp->getName()+",") != -1) + { + return; + } +//mk controlp->set(floaterp->childGetValue("val_spinner_1")); break; case TYPE_F32: +//MK + // If this debug setting can be changed through RLV and a setdebug restriction is active, ignore the change + if (RRenabled && gAgent.mRRInterface.contains ("setdebug") + && gAgent.mRRInterface.sAllowedF32.find (","+controlp->getName()+",") != -1) + { + return; + } +//mk controlp->set(LLSD(floaterp->childGetValue("val_spinner_1").asReal())); break; case TYPE_BOOLEAN: +//MK + // If this debug setting can be changed through RLV and a setdebug restriction is active, ignore the change + if (RRenabled && gAgent.mRRInterface.contains ("setdebug") + && gAgent.mRRInterface.sAllowedBOOLEAN.find (","+controlp->getName()+",") != -1) + { + return; + } + // Special case : don't allow changing VertexShaderEnable nor WindLightUseAtmosShaders if setenv is on + if (RRenabled && gAgent.mRRInterface.mContainsSetenv) + { + if (controlp->getName() == "VertexShaderEnable" + || controlp->getName() == "WindLightUseAtmosShaders" + ) { + return; + } + } +//mk controlp->set(floaterp->childGetValue("boolean_combo")); break; case TYPE_STRING: +//MK + // If this debug setting can be changed through RLV and a setdebug restriction is active, ignore the change + if (RRenabled && gAgent.mRRInterface.contains ("setdebug") + && gAgent.mRRInterface.sAllowedSTRING.find (","+controlp->getName()+",") != -1) + { + return; + } +//mk controlp->set(LLSD(floaterp->childGetValue("val_text").asString())); break; case TYPE_VEC3: +//MK + // If this debug setting can be changed through RLV and a setdebug restriction is active, ignore the change + if (RRenabled && gAgent.mRRInterface.contains ("setdebug") + && gAgent.mRRInterface.sAllowedVEC3.find (","+controlp->getName()+",") != -1) + { + return; + } +//mk vector.mV[VX] = (F32)floaterp->childGetValue("val_spinner_1").asReal(); vector.mV[VY] = (F32)floaterp->childGetValue("val_spinner_2").asReal(); vector.mV[VZ] = (F32)floaterp->childGetValue("val_spinner_3").asReal(); controlp->set(vector.getValue()); break; case TYPE_VEC3D: +//MK + // If this debug setting can be changed through RLV and a setdebug restriction is active, ignore the change + if (RRenabled && gAgent.mRRInterface.contains ("setdebug") + && gAgent.mRRInterface.sAllowedVEC3D.find (","+controlp->getName()+",") != -1) + { + return; + } +//mk vectord.mdV[VX] = floaterp->childGetValue("val_spinner_1").asReal(); vectord.mdV[VY] = floaterp->childGetValue("val_spinner_2").asReal(); vectord.mdV[VZ] = floaterp->childGetValue("val_spinner_3").asReal(); controlp->set(vectord.getValue()); break; case TYPE_RECT: +//MK + // If this debug setting can be changed through RLV and a setdebug restriction is active, ignore the change + if (RRenabled && gAgent.mRRInterface.contains ("setdebug") + && gAgent.mRRInterface.sAllowedRECT.find (","+controlp->getName()+",") != -1) + { + return; + } +//mk rect.mLeft = floaterp->childGetValue("val_spinner_1").asInteger(); rect.mRight = floaterp->childGetValue("val_spinner_2").asInteger(); rect.mBottom = floaterp->childGetValue("val_spinner_3").asInteger(); @@ -177,11 +256,27 @@ void LLFloaterSettingsDebug::onCommitSettings(LLUICtrl* ctrl, void* user_data) controlp->set(rect.getValue()); break; case TYPE_COL4: +//MK + // If this debug setting can be changed through RLV and a setdebug restriction is active, ignore the change + if (RRenabled && gAgent.mRRInterface.contains ("setdebug") + && gAgent.mRRInterface.sAllowedCOL4.find (","+controlp->getName()+",") != -1) + { + return; + } +//mk col3.setValue(floaterp->childGetValue("color_swatch")); col4 = LLColor4(col3, (F32)floaterp->childGetValue("val_spinner_4").asReal()); controlp->set(col4.getValue()); break; case TYPE_COL3: +//MK + // If this debug setting can be changed through RLV and a setdebug restriction is active, ignore the change + if (RRenabled && gAgent.mRRInterface.contains ("setdebug") + && gAgent.mRRInterface.sAllowedCOL3.find (","+controlp->getName()+",") != -1) + { + return; + } +//mk controlp->set(floaterp->childGetValue("color_swatch")); //col3.mV[VRED] = (F32)floaterp->childGetValue("val_spinner_1").asC(); //col3.mV[VGREEN] = (F32)floaterp->childGetValue("val_spinner_2").asReal(); @@ -189,6 +284,14 @@ void LLFloaterSettingsDebug::onCommitSettings(LLUICtrl* ctrl, void* user_data) //controlp->set(col3.getValue()); break; case TYPE_COL4U: +//MK + // If this debug setting can be changed through RLV and a setdebug restriction is active, ignore the change + if (RRenabled && gAgent.mRRInterface.contains ("setdebug") + && gAgent.mRRInterface.sAllowedCOL4U.find (","+controlp->getName()+",") != -1) + { + return; + } +//mk col3.setValue(floaterp->childGetValue("color_swatch")); col4U.setVecScaleClamp(col3); col4U.mV[VALPHA] = floaterp->childGetValue("val_spinner_4").asInteger(); @@ -202,6 +305,14 @@ void LLFloaterSettingsDebug::onCommitSettings(LLUICtrl* ctrl, void* user_data) // static void LLFloaterSettingsDebug::onClickDefault(void* user_data) { +//MK + // Don't allow Reset To Default when under @setdebug (that could give funny results) + if (RRenabled && gAgent.mRRInterface.contains ("setdebug")) + { + return; + } +//mk + LLFloaterSettingsDebug* floaterp = (LLFloaterSettingsDebug*)user_data; LLComboBox* settings_combo = floaterp->getChild("settings_combo"); LLControlVariable* controlp = (LLControlVariable*)settings_combo->getCurrentUserdata(); diff --git a/linden/indra/newview/llfloatersnapshot.cpp b/linden/indra/newview/llfloatersnapshot.cpp index d86665c..9b38481 100644 --- a/linden/indra/newview/llfloatersnapshot.cpp +++ b/linden/indra/newview/llfloatersnapshot.cpp @@ -74,6 +74,10 @@ #include "llvfile.h" #include "llvfs.h" +//MK +extern BOOL RRenabled; +//mk + ///---------------------------------------------------------------------------- /// Local function declarations, constants, enums, and typedefs ///---------------------------------------------------------------------------- @@ -949,6 +953,12 @@ void LLSnapshotLivePreview::saveTexture() LLVFile::writeFile(formatted->getData(), formatted->getDataSize(), gVFS, new_asset_id, LLAssetType::AT_TEXTURE); std::string pos_string; gAgent.buildLocationString(pos_string); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + pos_string = "(Region hidden)"; + } +//mk std::string who_took_it; gAgent.buildFullname(who_took_it); upload_new_resource(tid, // tid @@ -1274,6 +1284,14 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater) && got_bytes && previewp->getDataSize() > MAX_POSTCARD_DATASIZE ? LLColor4::red : gColors.getColor( "LabelTextColor" )); +//MK + if (RRenabled && gAgent.mRRInterface.mHasLockedHuds) + { + floater->childSetValue("hud_check", TRUE); + gSavedSettings.setBOOL( "RenderHUDInSnapshot", TRUE ); + } +//mk + switch(shot_type) { case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: @@ -1482,6 +1500,12 @@ void LLFloaterSnapshot::Impl::onClickHUDCheck(LLUICtrl *ctrl, void* data) { LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl; gSavedSettings.setBOOL( "RenderHUDInSnapshot", check->get() ); +//MK + if (RRenabled && gAgent.mRRInterface.mHasLockedHuds) + { + gSavedSettings.setBOOL( "RenderHUDInSnapshot", TRUE ); + } +//mk LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; if (view) @@ -1986,6 +2010,13 @@ BOOL LLFloaterSnapshot::postBuild() childSetCommitCallback("hud_check", Impl::onClickHUDCheck, this); childSetValue("hud_check", gSavedSettings.getBOOL("RenderHUDInSnapshot")); +//MK + if (RRenabled && gAgent.mRRInterface.mHasLockedHuds) + { + childSetValue("hud_check", TRUE); + gSavedSettings.setBOOL( "RenderHUDInSnapshot", TRUE ); + } +//mk childSetCommitCallback("keep_open_check", Impl::onClickKeepOpenCheck, this); childSetValue("keep_open_check", !gSavedSettings.getBOOL("CloseSnapshotOnKeep")); diff --git a/linden/indra/newview/llfloaterteleporthistory.cpp b/linden/indra/newview/llfloaterteleporthistory.cpp index 6285a49..b76f4ae 100644 --- a/linden/indra/newview/llfloaterteleporthistory.cpp +++ b/linden/indra/newview/llfloaterteleporthistory.cpp @@ -34,6 +34,9 @@ #include "linden_common.h" +#include "llworld.h" +#include "lleventpoll.h" +#include "llagent.h" #include "llfloaterteleporthistory.h" #include "llfloaterworldmap.h" #include "lltimer.h" @@ -46,6 +49,10 @@ #include "apr_time.h" +//MK +extern BOOL RRenabled; +//mk + // globals LLFloaterTeleportHistory* gFloaterTeleportHistory; @@ -99,6 +106,12 @@ BOOL LLFloaterTeleportHistory::postBuild() void LLFloaterTeleportHistory::addEntry(std::string regionName, S16 x, S16 y, S16 z) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + return; + } +//mk // only if the cached scroll list pointer is valid if(mPlacesList) { diff --git a/linden/indra/newview/llfloaterworldmap.cpp b/linden/indra/newview/llfloaterworldmap.cpp index 956e146..453cb13 100644 --- a/linden/indra/newview/llfloaterworldmap.cpp +++ b/linden/indra/newview/llfloaterworldmap.cpp @@ -71,6 +71,10 @@ #include "llglheaders.h" +//MK +extern BOOL RRenabled; +//mk + //--------------------------------------------------------------------------- // Constants //--------------------------------------------------------------------------- @@ -280,6 +284,14 @@ void LLFloaterWorldMap::onClose(bool app_quitting) // static void LLFloaterWorldMap::show(void*, BOOL center_on_target) { +//MK + if (RRenabled && ( + gAgent.mRRInterface.mContainsShowworldmap + || gAgent.mRRInterface.mContainsShowloc)) + { + return; + } +//mk BOOL was_visible = gFloaterWorldMap->getVisible(); gFloaterWorldMap->mIsClosing = FALSE; @@ -1678,3 +1690,16 @@ void LLFloaterWorldMap::onCommitSearchResult(LLUICtrl*, void* userdata) onShowTargetBtn(self); } + +//MK +void LLFloaterWorldMap::open() +{ + if (RRenabled && ( + gAgent.mRRInterface.mContainsShowworldmap + || gAgent.mRRInterface.mContainsShowloc)) + { + return; + } + LLFloater::open(); +} +//mk diff --git a/linden/indra/newview/llfloaterworldmap.h b/linden/indra/newview/llfloaterworldmap.h index 568d3cc..6a81fae 100644 --- a/linden/indra/newview/llfloaterworldmap.h +++ b/linden/indra/newview/llfloaterworldmap.h @@ -110,6 +110,9 @@ class LLFloaterWorldMap : public LLFloater // teleport to the tracked item, if there is one void teleport(); +//MK + /*virtual*/ void open(); +//mk protected: static void onPanBtn( void* userdata ); diff --git a/linden/indra/newview/llgesturemgr.cpp b/linden/indra/newview/llgesturemgr.cpp index a8e152c..4eaf07a 100644 --- a/linden/indra/newview/llgesturemgr.cpp +++ b/linden/indra/newview/llgesturemgr.cpp @@ -57,6 +57,10 @@ #include "llvoavatar.h" #include "llviewerstats.h" +//MK +extern BOOL RRenabled; +//mk + LLGestureManager gGestureManager; // Longest time, in seconds, to wait for all animations to stop playing @@ -868,7 +872,13 @@ void LLGestureManager::runStep(LLMultiGesture* gesture, LLGestureStep* step) // Don't animate the nodding, as this might not blend with // other playing animations. const BOOL animate = FALSE; - +//MK + if (RRenabled && gAgent.mRRInterface.contains ("sendchat") + && chat_text.find ("/me ") != 0 && chat_text.find ("/me'") != 0) + { + chat_text = gAgent.mRRInterface.crunchEmote (chat_text, 20); + } +//mk gChatBar->sendChatFromViewer(chat_text, CHAT_TYPE_NORMAL, animate); gesture->mCurrentStep++; break; diff --git a/linden/indra/newview/llglsandbox.cpp b/linden/indra/newview/llglsandbox.cpp index 50c6dbf..e8ad9cc 100644 --- a/linden/indra/newview/llglsandbox.cpp +++ b/linden/indra/newview/llglsandbox.cpp @@ -68,6 +68,10 @@ #include "pipeline.h" #include "llspatialpartition.h" +//MK +extern BOOL RRenabled; +//mk + BOOL LLAgent::setLookAt(ELookAtType target_type, LLViewerObject *object, LLVector3 position) { if (object && target_type != LOOKAT_TARGET_NONE && gSavedSettings.getBOOL("PrivateLookAt")) @@ -250,6 +254,13 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask) LLViewerCamera::getInstance()->setFar(new_far); LLViewerCamera::getInstance()->setNear(new_near); } +//MK + if (RRenabled && gAgent.mRRInterface.mContainsFartouch) { + // don't allow select by rectangle while under fartouch + LLViewerCamera::getInstance()->setFar(0.0f); + LLViewerCamera::getInstance()->setNear(0.0f); + } +//mk LLViewerCamera::getInstance()->setPerspective(FOR_SELECTION, center_x-width/2, center_y-height/2, width, height, limit_select_distance); diff --git a/linden/indra/newview/llhoverview.cpp b/linden/indra/newview/llhoverview.cpp index 8d033b2..da5156b 100644 --- a/linden/indra/newview/llhoverview.cpp +++ b/linden/indra/newview/llhoverview.cpp @@ -77,6 +77,10 @@ const char* DEFAULT_DESC = "(No Description)"; const F32 DELAY_BEFORE_SHOW_TIP = 0.35f; +//MK +extern BOOL RRenabled; +//mk + // // Local globals // @@ -257,6 +261,16 @@ void LLHoverView::updateText() { line.append(LLTrans::getString("TooltipPerson")); } +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + line.clear(); + line.append(firstname->getString()); + line.append(1, ' '); + line.append(lastname->getString()); + line = gAgent.mRRInterface.getDummyName (line); + } +//mk mText.push_back(line); } else @@ -307,6 +321,12 @@ void LLHoverView::updateText() } else if(gCacheName->getFullName(owner, name)) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + name = gAgent.mRRInterface.getDummyName (name); + } +//mk line.append(name); } else diff --git a/linden/indra/newview/llhudtext.cpp b/linden/indra/newview/llhudtext.cpp index 32323dc..ae2e0fd 100644 --- a/linden/indra/newview/llhudtext.cpp +++ b/linden/indra/newview/llhudtext.cpp @@ -57,6 +57,12 @@ #include +//MK +#include "llviewerregion.h" + +extern BOOL RRenabled; +//mk + const F32 SPRING_STRENGTH = 0.7f; const F32 RESTORATION_SPRING_TIME_CONSTANT = 0.1f; const F32 HORIZONTAL_PADDING = 15.f; @@ -571,7 +577,41 @@ void LLHUDText::setStringUTF8(const std::string &wtext) void LLHUDText::setString(const LLWString &wtext) { mTextSegments.clear(); - addLine(wtext, mColor); +//MK + if (RRenabled) + { + LLWString local_wtext = wtext; + if (gAgent.mRRInterface.mContainsShowhovertextall) + { + local_wtext = utf8str_to_wstring("", 0); + } + else if ((mOnHUDAttachment && gAgent.mRRInterface.mContainsShowhovertexthud) + || (!mOnHUDAttachment && gAgent.mRRInterface.mContainsShowhovertextworld) + || (mSourceObject && gAgent.mRRInterface.contains("showhovertext:"+mSourceObject->getID().asString()))) + { + local_wtext = utf8str_to_wstring("", 0); + } + else + { + if (gAgent.mRRInterface.mContainsShowloc) + { + std::string str = wstring_to_utf8str(local_wtext, local_wtext.length()); + str = gAgent.mRRInterface.stringReplace(str, gAgent.mRRInterface.getParcelName(), "(Parcel hidden)"); + str = gAgent.mRRInterface.stringReplace(str, gAgent.getRegion()->getName(), "(Region hidden)"); + local_wtext = utf8str_to_wstring(str, str.length()); + } + if (gAgent.mRRInterface.mContainsShownames) + { + std::string str = wstring_to_utf8str(local_wtext, local_wtext.length()); + str = gAgent.mRRInterface.getCensoredMessage(str); + local_wtext = utf8str_to_wstring(str, str.length()); + } + } + addLine(local_wtext, mColor); + } + else +//mk + addLine(wtext, mColor); } void LLHUDText::clearString() diff --git a/linden/indra/newview/llhudtext.h b/linden/indra/newview/llhudtext.h index 6e29d9d..395a3f9 100644 --- a/linden/indra/newview/llhudtext.h +++ b/linden/indra/newview/llhudtext.h @@ -139,6 +139,12 @@ class LLHUDText : public LLHUDObject static void updateAll(); void setLOD(S32 lod); S32 getMaxLines(); + +//MK +public: + // This variable is here to allow one to refresh a HUD text by calling setStringUTF8, it is set when an update message is received + std::string mLastMessageText; +//mk private: ~LLHUDText(); @@ -176,6 +182,10 @@ class LLHUDText : public LLHUDObject S32 mLOD; BOOL mHidden; +//MK + // I am making these members public. I know, it's evil, but they are needed in RRInterface. None of them will be harmed, promised. +public: +//mk static BOOL sDisplayText ; static std::set > sTextObjects; static std::vector > sVisibleTextObjects; diff --git a/linden/indra/newview/llhudview.cpp b/linden/indra/newview/llhudview.cpp index 9584a2a..8fbd2be 100644 --- a/linden/indra/newview/llhudview.cpp +++ b/linden/indra/newview/llhudview.cpp @@ -52,8 +52,8 @@ LLHUDView *gHUDView = NULL; const S32 HUD_ARROW_SIZE = 32; -LLHUDView::LLHUDView() -: LLPanel() +LLHUDView::LLHUDView(const std::string& name, const LLRect& rect) +: LLView(name, rect, FALSE) { } LLHUDView::~LLHUDView() diff --git a/linden/indra/newview/llhudview.h b/linden/indra/newview/llhudview.h index 277eb49..0b53ad5 100644 --- a/linden/indra/newview/llhudview.h +++ b/linden/indra/newview/llhudview.h @@ -32,16 +32,16 @@ #ifndef LL_LLHUDVIEW_H #define LL_LLHUDVIEW_H -#include "llpanel.h" +#include "llview.h" #include "v4color.h" class LLVector3d; class LLHUDView -: public LLPanel +: public LLView { public: - LLHUDView(); + LLHUDView(const std::string& name, const LLRect& rect); virtual ~LLHUDView(); virtual void draw(); diff --git a/linden/indra/newview/llimpanel.cpp b/linden/indra/newview/llimpanel.cpp index d63b7a9..68c293d 100644 --- a/linden/indra/newview/llimpanel.cpp +++ b/linden/indra/newview/llimpanel.cpp @@ -74,6 +74,10 @@ #include "llmutelist.h" #include "llstylemap.h" +//MK +extern BOOL RRenabled; +//mk + // // Constants // @@ -1975,6 +1979,13 @@ void LLFloaterIMPanel::sendMsg() if (mInputEditor) { LLWString text = mInputEditor->getConvertedText(); +//MK + if (RRenabled && gAgent.mRRInterface.containsWithoutException ("sendim", mOtherParticipantUUID.asString())) + { + // user is forbidden to send IMs and the receiver is no exception + text = utf8str_to_wstring("*** IM blocked by sender's viewer"); // signal both the sender and the receiver + } +//mk if(!text.empty()) { // store sent line in history, duplicates will get filtered diff --git a/linden/indra/newview/llimview.cpp b/linden/indra/newview/llimview.cpp index 5167fb0..6ccd20b 100644 --- a/linden/indra/newview/llimview.cpp +++ b/linden/indra/newview/llimview.cpp @@ -49,6 +49,7 @@ #include "llfloaterchat.h" #include "llfloaterchatterbox.h" #include "llfloaternewim.h" +#include "llfocusmgr.h" #include "llhttpnode.h" #include "llimpanel.h" #include "llresizebar.h" @@ -69,6 +70,10 @@ #include "llfirstuse.h" +//MK +extern BOOL RRenabled; +//mk + // // Globals // @@ -87,6 +92,9 @@ std::map LLFloaterIM::sEventStringsMap; std::map LLFloaterIM::sErrorStringsMap; std::map LLFloaterIM::sForceCloseSessionMap; +const EInstantMessage GROUP_DIALOG = IM_SESSION_GROUP_START; +const EInstantMessage DEFAULT_DIALOG = IM_NOTHING_SPECIAL; + // // Helper Functions // @@ -338,6 +346,34 @@ void LLIMMgr::toggle(void*) BOOL new_state = !old_state; + LLFloaterChatterBox* floater_chatterbox = gIMMgr->getFloater(); + LLFloater* floater_current = floater_chatterbox->getActiveFloater(); + LLFloater* floater_new_im = floater_chatterbox->getFloaterNewIM(); + BOOL active_is_im = (floater_current && floater_current->getName() == "im_floater" || floater_current==floater_new_im); + + if (floater_chatterbox) { // "2" for toggle + + if (LLFloaterChatterBox::instanceVisible(LLSD())) + { + BOOL has_focus = gFocusMgr.childHasKeyboardFocus(floater_chatterbox); + + if (active_is_im && has_focus) + { + // toggling away from an im-panel (or with no available im panel) => close + new_state = FALSE; + } + else + { + // stay open, but switch to an IM panel or just activate + new_state = TRUE; + } + } + else + { + new_state = TRUE; + } + } + if (new_state) { // ...making visible @@ -1004,8 +1040,61 @@ void LLIMMgr::inviteUserResponse(S32 option, void* user_data) delete invitep; } +//returns true if a should appear before b +static BOOL group_dictionary_sort( LLGroupData* a, LLGroupData* b ) +{ + return (LLStringUtil::compareDict( a->mName, b->mName ) < 0); +} + void LLIMMgr::refresh() { + LLFloaterNewIM* floaterimp = LLFloaterChatterBox::getInstance(LLSD())->getFloaterNewIM(); + + if (!floaterimp) return; + + S32 old_scroll_pos = floaterimp->getScrollPos(); + floaterimp->clearAllTargets(); + + // build a list of groups. + LLLinkedList group_list( group_dictionary_sort ); + + LLGroupData* group; + S32 count = gAgent.mGroups.count(); + S32 i; + // read/sort groups on the first pass. + for(i = 0; i < count; ++i) + { + group = &(gAgent.mGroups.get(i)); + group_list.addDataSorted( group ); + } + + // add groups to the floater on the second pass. + for(group = group_list.getFirstData(); + group; + group = group_list.getNextData()) + { + floaterimp->addGroup(group->mID, (void*)(&GROUP_DIALOG), TRUE, FALSE); + } + + // build a set of buddies in the current buddy list. + LLCollectAllBuddies collector; + LLAvatarTracker::instance().applyFunctor(collector); + LLCollectAllBuddies::buddy_map_t::iterator it; + LLCollectAllBuddies::buddy_map_t::iterator end; + it = collector.mOnline.begin(); + end = collector.mOnline.end(); + for( ; it != end; ++it) + { + floaterimp->addAgent((*it).second, (void*)(&DEFAULT_DIALOG), TRUE); + } + it = collector.mOffline.begin(); + end = collector.mOffline.end(); + for( ; it != end; ++it) + { + floaterimp->addAgent((*it).second, (void*)(&DEFAULT_DIALOG), FALSE); + } + + floaterimp->setScrollPos( old_scroll_pos ); } void LLIMMgr::setFloaterOpen(BOOL set_open) @@ -1013,6 +1102,40 @@ void LLIMMgr::setFloaterOpen(BOOL set_open) if (set_open) { LLFloaterChatterBox::showInstance(); + + LLFloaterChatterBox* floater_chatterbox = getFloater(); + LLFloater* floater_current = floater_chatterbox->getActiveFloater(); + LLFloater* floater_new_im = floater_chatterbox->getFloaterNewIM(); + BOOL active_is_im = (floater_current && floater_current->getName() == "im_floater" || floater_current==floater_new_im); + LLFloater* floater_to_show = active_is_im ? floater_current : NULL; + LLTabContainer* tabs = floater_chatterbox->getChild("chatterbox_tabs"); + + for (S32 i = 0; i < floater_chatterbox->getFloaterCount(); i++) + { + LLPanel* panelp = tabs->getPanelByIndex(i); + if (panelp->getName() == "im_floater") + { + // only LLFloaterIMPanels are called "im_floater" + LLFloaterIMPanel* im_floaterp = (LLFloaterIMPanel*)panelp; + if(im_floaterp) + { + if (!floater_to_show || floater_chatterbox->isFloaterFlashing(im_floaterp)) + { + floater_to_show = im_floaterp; // the first im_floater or the flashing im_floater + } + } + } + } + + if (floater_to_show) + { + floater_to_show->open(); + } + else + if (floater_chatterbox && floater_chatterbox->getFloaterNewIM()) + { + floater_chatterbox->getFloaterNewIM()->open(); + } } else { @@ -1542,7 +1665,12 @@ class LLViewerChatterBoxInvitation : public LLHTTPNode { return; } - +//MK + if (RRenabled && gAgent.mRRInterface.containsWithoutException ("recvim")) + { + return; + } +//mk // standard message, not from system std::string saved; if(offline == IM_OFFLINE) diff --git a/linden/indra/newview/llimview.cpp.orig b/linden/indra/newview/llimview.cpp.orig new file mode 100644 index 0000000..f8f5a86 --- /dev/null +++ b/linden/indra/newview/llimview.cpp.orig @@ -0,0 +1,1657 @@ +/** + * @file LLIMMgr.cpp + * @brief Container for Instant Messaging + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llimview.h" + +#include "llfontgl.h" +#include "llrect.h" +#include "llerror.h" +#include "llbutton.h" +#include "llhttpclient.h" +#include "llsdutil.h" +#include "llstring.h" +#include "lluictrlfactory.h" + +#include "llagent.h" +#include "llcallingcard.h" +#include "llchat.h" +#include "llresmgr.h" +#include "llfloaterchat.h" +#include "llfloaterchatterbox.h" +#include "llfloaternewim.h" +#include "llhttpnode.h" +#include "llimpanel.h" +#include "llresizebar.h" +#include "lltabcontainer.h" +#include "llviewercontrol.h" +#include "llfloater.h" +#include "llmutelist.h" +#include "llresizehandle.h" +#include "llkeyboard.h" +#include "llui.h" +#include "llviewermenu.h" +#include "llcallingcard.h" +#include "lltoolbar.h" +#include "llviewermessage.h" +#include "llviewerwindow.h" +#include "llnotify.h" +#include "llviewerregion.h" + +#include "llfirstuse.h" + +//MK +extern BOOL RRenabled; +//mk + +// +// Globals +// +LLIMMgr* gIMMgr = NULL; + +// +// Statics +// +// *FIXME: make these all either UIStrings or Strings +static std::string sOnlyUserMessage; +static LLUIString sOfflineMessage; +static std::string sMutedMessage; +static LLUIString sInviteMessage; + +std::map LLFloaterIM::sEventStringsMap; +std::map LLFloaterIM::sErrorStringsMap; +std::map LLFloaterIM::sForceCloseSessionMap; + +// +// Helper Functions +// + +// returns true if a should appear before b +//static BOOL group_dictionary_sort( LLGroupData* a, LLGroupData* b ) +//{ +// return (LLStringUtil::compareDict( a->mName, b->mName ) < 0); +//} + + +// the other_participant_id is either an agent_id, a group_id, or an inventory +// folder item_id (collection of calling cards) + +// static +LLUUID LLIMMgr::computeSessionID( + EInstantMessage dialog, + const LLUUID& other_participant_id) +{ + LLUUID session_id; + if (IM_SESSION_GROUP_START == dialog) + { + // slam group session_id to the group_id (other_participant_id) + session_id = other_participant_id; + } + else if (IM_SESSION_CONFERENCE_START == dialog) + { + session_id.generate(); + } + else if (IM_SESSION_INVITE == dialog) + { + // use provided session id for invites + session_id = other_participant_id; + } + else + { + LLUUID agent_id = gAgent.getID(); + if (other_participant_id == agent_id) + { + // if we try to send an IM to ourselves then the XOR would be null + // so we just make the session_id the same as the agent_id + session_id = agent_id; + } + else + { + // peer-to-peer or peer-to-asset session_id is the XOR + session_id = other_participant_id ^ agent_id; + } + } + return session_id; +} + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// LLFloaterIM +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +LLFloaterIM::LLFloaterIM() +{ + // autoresize=false is necessary to avoid resizing of the IM window whenever + // a session is opened or closed (it would otherwise resize the window to match + // the size of the im-sesssion when they were created. This happens in + // LLMultiFloater::resizeToContents() when called through LLMultiFloater::addFloater()) + this->mAutoResize = FALSE; + LLUICtrlFactory::getInstance()->buildFloater(this, "floater_im.xml"); +} + +BOOL LLFloaterIM::postBuild() +{ + // IM session initiation warnings + sOnlyUserMessage = getString("only_user_message"); + sOfflineMessage = getString("offline_message"); + sMutedMessage = getString("muted_message"); + + sInviteMessage = getString("invite_message"); + + if ( sErrorStringsMap.find("generic") == sErrorStringsMap.end() ) + { + sErrorStringsMap["generic"] = + getString("generic_request_error"); + } + + if ( sErrorStringsMap.find("unverified") == + sErrorStringsMap.end() ) + { + sErrorStringsMap["unverified"] = + getString("insufficient_perms_error"); + } + + if ( sErrorStringsMap.end() == + sErrorStringsMap.find("no_ability") ) + { + sErrorStringsMap["no_ability"] = + getString("no_ability_error"); + } + + if ( sErrorStringsMap.end() == + sErrorStringsMap.find("muted") ) + { + sErrorStringsMap["muted"] = + getString("muted_error"); + } + + if ( sErrorStringsMap.end() == + sErrorStringsMap.find("not_a_moderator") ) + { + sErrorStringsMap["not_a_moderator"] = + getString("not_a_mod_error"); + } + + if ( sErrorStringsMap.end() == + sErrorStringsMap.find("does not exist") ) + { + sErrorStringsMap["does not exist"] = + getString("session_does_not_exist_error"); + } + + if ( sEventStringsMap.end() == sEventStringsMap.find("add") ) + { + sEventStringsMap["add"] = + getString("add_session_event"); + } + + if ( sEventStringsMap.end() == sEventStringsMap.find("message") ) + { + sEventStringsMap["message"] = + getString("message_session_event"); + } + + + if ( sForceCloseSessionMap.end() == + sForceCloseSessionMap.find("removed") ) + { + sForceCloseSessionMap["removed"] = + getString("removed_from_group"); + } + + if ( sForceCloseSessionMap.end() == + sForceCloseSessionMap.find("no ability") ) + { + sForceCloseSessionMap["no ability"] = + getString("close_on_no_ability"); + } + + return TRUE; +} + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLIMViewFriendObserver +// +// Bridge to suport knowing when the inventory has changed. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLIMViewFriendObserver : public LLFriendObserver +{ +public: + LLIMViewFriendObserver(LLIMMgr* tv) : mTV(tv) {} + virtual ~LLIMViewFriendObserver() {} + virtual void changed(U32 mask) + { + if(mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::ONLINE)) + { + mTV->refresh(); + } + } +protected: + LLIMMgr* mTV; +}; + + +class LLIMMgr::LLIMSessionInvite +{ +public: + LLIMSessionInvite( + const LLUUID& session_id, + const std::string& session_name, + const LLUUID& caller_id, + const std::string& caller_name, + EInstantMessage type, + EInvitationType inv_type, + const std::string& session_handle, + const std::string& notify_box, + const std::string& session_uri) : + mSessionID(session_id), + mSessionName(session_name), + mCallerID(caller_id), + mCallerName(caller_name), + mType(type), + mInvType(inv_type), + mSessionHandle(session_handle), + mNotifyBox(notify_box), + mSessionURI(session_uri) + {}; + + LLUUID mSessionID; + std::string mSessionName; + LLUUID mCallerID; + std::string mCallerName; + EInstantMessage mType; + EInvitationType mInvType; + std::string mSessionHandle; + std::string mNotifyBox; + std::string mSessionURI; +}; + + +// +// Public Static Member Functions +// + +// This is a helper function to determine what kind of im session +// should be used for the given agent. +// static +EInstantMessage LLIMMgr::defaultIMTypeForAgent(const LLUUID& agent_id) +{ + EInstantMessage type = IM_NOTHING_SPECIAL; + if(is_agent_friend(agent_id)) + { + if(LLAvatarTracker::instance().isBuddyOnline(agent_id)) + { + type = IM_SESSION_CONFERENCE_START; + } + } + return type; +} + +// static +//void LLIMMgr::onPinButton(void*) +//{ +// BOOL state = gSavedSettings.getBOOL( "PinTalkViewOpen" ); +// gSavedSettings.setBOOL( "PinTalkViewOpen", !state ); +//} + +// static +void LLIMMgr::toggle(void*) +{ + static BOOL return_to_mouselook = FALSE; + + // Hide the button and show the floater or vice versa. + llassert( gIMMgr ); + BOOL old_state = gIMMgr->getFloaterOpen(); + + // If we're in mouselook and we triggered the Talk View, we want to talk. + if( gAgent.cameraMouselook() && old_state ) + { + return_to_mouselook = TRUE; + gAgent.changeCameraToDefault(); + return; + } + + BOOL new_state = !old_state; + + if (new_state) + { + // ...making visible + if ( gAgent.cameraMouselook() ) + { + return_to_mouselook = TRUE; + gAgent.changeCameraToDefault(); + } + } + else + { + // ...hiding + if ( gAgent.cameraThirdPerson() && return_to_mouselook ) + { + gAgent.changeCameraToMouselook(); + } + return_to_mouselook = FALSE; + } + + gIMMgr->setFloaterOpen( new_state ); +} + +// +// Member Functions +// + +LLIMMgr::LLIMMgr() : + mFriendObserver(NULL), + mIMReceived(FALSE) +{ + mFriendObserver = new LLIMViewFriendObserver(this); + LLAvatarTracker::instance().addObserver(mFriendObserver); + + // *HACK: use floater to initialize string constants from xml file + // then delete it right away + LLFloaterIM* dummy_floater = new LLFloaterIM(); + delete dummy_floater; + + mPendingInvitations = LLSD::emptyMap(); + mPendingAgentListUpdates = LLSD::emptyMap(); +} + +LLIMMgr::~LLIMMgr() +{ + LLAvatarTracker::instance().removeObserver(mFriendObserver); + delete mFriendObserver; + // Children all cleaned up by default view destructor. +} + +// Add a message to a session. +void LLIMMgr::addMessage( + const LLUUID& session_id, + const LLUUID& target_id, + const std::string& from, + const std::string& msg, + const std::string& session_name, + EInstantMessage dialog, + U32 parent_estate_id, + const LLUUID& region_id, + const LLVector3& position, + bool link_name) // If this is true, then we insert the name and link it to a profile +{ + LLUUID other_participant_id = target_id; + + // don't process muted IMs + if (LLMuteList::getInstance()->isMuted( + other_participant_id, + LLMute::flagTextChat) && !LLMuteList::getInstance()->isLinden(from)) + { + return; + } + + //not sure why...but if it is from ourselves we set the target_id + //to be NULL + if( other_participant_id == gAgent.getID() ) + { + other_participant_id = LLUUID::null; + } + + LLFloaterIMPanel* floater; + LLUUID new_session_id = session_id; + if (new_session_id.isNull()) + { + //no session ID...compute new one + new_session_id = computeSessionID(dialog, other_participant_id); + } + floater = findFloaterBySession(new_session_id); + if (!floater) + { + floater = findFloaterBySession(other_participant_id); + if (floater) + { + llinfos << "found the IM session " << session_id + << " by participant " << other_participant_id << llendl; + } + } + + // create IM window as necessary + if(!floater) + { + std::string name = from; + if(!session_name.empty() && session_name.size()>1) + { + name = session_name; + } + + + floater = createFloater( + new_session_id, + other_participant_id, + name, + dialog, + FALSE); + + // When we get a new IM, and if you are a god, display a bit + // of information about the source. This is to help liaisons + // when answering questions. + if(gAgent.isGodlike()) + { + // *TODO:translate (low priority, god ability) + std::ostringstream bonus_info; + bonus_info << "*** parent estate: " + << parent_estate_id + << ((parent_estate_id == 1) ? ", mainland" : "") + << ((parent_estate_id == 5) ? ", teen" : ""); + + // once we have web-services (or something) which returns + // information about a region id, we can print this out + // and even have it link to map-teleport or something. + //<< "*** region_id: " << region_id << std::endl + //<< "*** position: " << position << std::endl; + + floater->addHistoryLine(bonus_info.str(), gSavedSettings.getColor4("SystemChatColor")); + } + + make_ui_sound("UISndNewIncomingIMSession"); + } + + // now add message to floater + bool is_from_system = target_id.isNull() || (from == SYSTEM_FROM); + const LLColor4& color = ( is_from_system ? + gSavedSettings.getColor4("SystemChatColor") : + gSavedSettings.getColor("IMChatColor")); + if ( !link_name ) + { + floater->addHistoryLine(msg,color); // No name to prepend, so just add the message normally + } + else + { + floater->addHistoryLine(msg, color, true, other_participant_id, from); // Insert linked name to front of message + } + + LLFloaterChatterBox* chat_floater = LLFloaterChatterBox::getInstance(LLSD()); + + if( !chat_floater->getVisible() && !floater->getVisible()) + { + //if the IM window is not open and the floater is not visible (i.e. not torn off) + LLFloater* previouslyActiveFloater = chat_floater->getActiveFloater(); + + // select the newly added floater (or the floater with the new line added to it). + // it should be there. + chat_floater->selectFloater(floater); + + //there was a previously unseen IM, make that old tab flashing + //it is assumed that the most recently unseen IM tab is the one current selected/active + if ( previouslyActiveFloater && getIMReceived() ) + { + chat_floater->setFloaterFlashing(previouslyActiveFloater, TRUE); + } + + //notify of a new IM + notifyNewIM(); + } +} + +void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& message_name, const LLStringUtil::format_map_t& args) +{ + LLUIString message; + + // null session id means near me (chat history) + if (session_id.isNull()) + { + LLFloaterChat* floaterp = LLFloaterChat::getInstance(); + + message = floaterp->getString(message_name); + message.setArgList(args); + + LLChat chat(message); + chat.mSourceType = CHAT_SOURCE_SYSTEM; + LLFloaterChat::getInstance()->addChatHistory(chat); + } + else // going to IM session + { + LLFloaterIMPanel* floaterp = findFloaterBySession(session_id); + if (floaterp) + { + message = floaterp->getString(message_name); + message.setArgList(args); + + gIMMgr->addMessage(session_id, LLUUID::null, SYSTEM_FROM, message.getString()); + } + } +} + +void LLIMMgr::notifyNewIM() +{ + if(!gIMMgr->getFloaterOpen()) + { + mIMReceived = TRUE; + } +} + +void LLIMMgr::clearNewIMNotification() +{ + mIMReceived = FALSE; +} + +BOOL LLIMMgr::getIMReceived() const +{ + return mIMReceived; +} + +// This method returns TRUE if the local viewer has a session +// currently open keyed to the uuid. +BOOL LLIMMgr::isIMSessionOpen(const LLUUID& uuid) +{ + LLFloaterIMPanel* floater = findFloaterBySession(uuid); + if(floater) return TRUE; + return FALSE; +} + +LLUUID LLIMMgr::addP2PSession(const std::string& name, + const LLUUID& other_participant_id, + const std::string& voice_session_handle, + const std::string& caller_uri) +{ + LLUUID session_id = addSession(name, IM_NOTHING_SPECIAL, other_participant_id); + + LLFloaterIMPanel* floater = findFloaterBySession(session_id); + if(floater) + { + LLVoiceChannelP2P* voice_channelp = (LLVoiceChannelP2P*)floater->getVoiceChannel(); + voice_channelp->setSessionHandle(voice_session_handle, caller_uri); + } + + return session_id; +} + +// This adds a session to the talk view. The name is the local name of +// the session, dialog specifies the type of session. If the session +// exists, it is brought forward. Specifying id = NULL results in an +// im session to everyone. Returns the uuid of the session. +LLUUID LLIMMgr::addSession( + const std::string& name, + EInstantMessage dialog, + const LLUUID& other_participant_id) +{ + LLUUID session_id = computeSessionID(dialog, other_participant_id); + + LLFloaterIMPanel* floater = findFloaterBySession(session_id); + if(!floater) + { + LLDynamicArray ids; + ids.put(other_participant_id); + + floater = createFloater( + session_id, + other_participant_id, + name, + ids, + dialog, + TRUE); + + noteOfflineUsers(floater, ids); + LLFloaterChatterBox::showInstance(session_id); + + // Only warn for regular IMs - not group IMs + if( dialog == IM_NOTHING_SPECIAL ) + { + noteMutedUsers(floater, ids); + } + LLFloaterChatterBox::getInstance(LLSD())->showFloater(floater); + } + else + { + floater->open(); + } + //mTabContainer->selectTabPanel(panel); + floater->setInputFocus(TRUE); + return floater->getSessionID(); +} + +// Adds a session using the given session_id. If the session already exists +// the dialog type is assumed correct. Returns the uuid of the session. +LLUUID LLIMMgr::addSession( + const std::string& name, + EInstantMessage dialog, + const LLUUID& other_participant_id, + const LLDynamicArray& ids) +{ + if (0 == ids.getLength()) + { + return LLUUID::null; + } + + LLUUID session_id = computeSessionID( + dialog, + other_participant_id); + + LLFloaterIMPanel* floater = findFloaterBySession(session_id); + if(!floater) + { + // On creation, use the first element of ids as the + // "other_participant_id" + floater = createFloater( + session_id, + other_participant_id, + name, + ids, + dialog, + TRUE); + + if ( !floater ) return LLUUID::null; + + noteOfflineUsers(floater, ids); + LLFloaterChatterBox::showInstance(session_id); + + // Only warn for regular IMs - not group IMs + if( dialog == IM_NOTHING_SPECIAL ) + { + noteMutedUsers(floater, ids); + } + } + else + { + floater->open(); + } + //mTabContainer->selectTabPanel(panel); + floater->setInputFocus(TRUE); + return floater->getSessionID(); +} + +// This removes the panel referenced by the uuid, and then restores +// internal consistency. The internal pointer is not deleted. +void LLIMMgr::removeSession(const LLUUID& session_id) +{ + LLFloaterIMPanel* floater = findFloaterBySession(session_id); + if(floater) + { + mFloaters.erase(floater->getHandle()); + LLFloaterChatterBox::getInstance(LLSD())->removeFloater(floater); + //mTabContainer->removeTabPanel(floater); + + clearPendingInviation(session_id); + clearPendingAgentListUpdates(session_id); + } +} + +void LLIMMgr::inviteToSession( + const LLUUID& session_id, + const std::string& session_name, + const LLUUID& caller_id, + const std::string& caller_name, + EInstantMessage type, + EInvitationType inv_type, + const std::string& session_handle, + const std::string& session_uri) +{ + //ignore invites from muted residents + if (LLMuteList::getInstance()->isMuted(caller_id)) + { + return; + } + + std::string notify_box_type; + + BOOL ad_hoc_invite = FALSE; + if(type == IM_SESSION_P2P_INVITE) + { + //P2P is different...they only have voice invitations + notify_box_type = "VoiceInviteP2P"; + } + else if ( gAgent.isInGroup(session_id) ) + { + //only really old school groups have voice invitations + notify_box_type = "VoiceInviteGroup"; + } + else if ( inv_type == INVITATION_TYPE_VOICE ) + { + //else it's an ad-hoc + //and a voice ad-hoc + notify_box_type = "VoiceInviteAdHoc"; + ad_hoc_invite = TRUE; + } + else if ( inv_type == INVITATION_TYPE_IMMEDIATE ) + { + notify_box_type = "InviteAdHoc"; + ad_hoc_invite = TRUE; + } + + LLIMSessionInvite* invite = new LLIMSessionInvite( + session_id, + session_name, + caller_id, + caller_name, + type, + inv_type, + session_handle, + notify_box_type, + session_uri); + + LLVoiceChannel* channelp = LLVoiceChannel::getChannelByID(session_id); + if (channelp && channelp->callStarted()) + { + // you have already started a call to the other user, so just accept the invite + inviteUserResponse(0, invite); // inviteUserResponse deletes + return; + } + + if (type == IM_SESSION_P2P_INVITE || ad_hoc_invite) + { + // is the inviter a friend? + if (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL) + { + // if not, and we are ignoring voice invites from non-friends + // then silently decline + if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly")) + { + // invite not from a friend, so decline + inviteUserResponse(1, invite); // inviteUserResponse deletes + return; + } + } + } + + if ( !mPendingInvitations.has(session_id.asString()) ) + { + if (caller_name.empty()) + { + gCacheName->get(caller_id, FALSE, onInviteNameLookup, invite); + } + else + { + LLStringUtil::format_map_t args; + args["[NAME]"] = caller_name; + args["[GROUP]"] = session_name; + + LLNotifyBox::showXml(notify_box_type, + args, + inviteUserResponse, + (void*)invite); // inviteUserResponse deletes + + } + mPendingInvitations[session_id.asString()] = LLSD(); + } + else + { + delete invite; + } +} + +//static +void LLIMMgr::onInviteNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* userdata) +{ + LLIMSessionInvite* invite = (LLIMSessionInvite*)userdata; + + invite->mCallerName = first + " " + last; + invite->mSessionName = invite->mCallerName; + + LLStringUtil::format_map_t args; + args["[NAME]"] = invite->mCallerName; + + LLNotifyBox::showXml( + invite->mNotifyBox, + args, + inviteUserResponse, + (void*)invite); +} + +class LLViewerChatterBoxInvitationAcceptResponder : + public LLHTTPClient::Responder +{ +public: + LLViewerChatterBoxInvitationAcceptResponder( + const LLUUID& session_id, + LLIMMgr::EInvitationType invitation_type) + { + mSessionID = session_id; + mInvitiationType = invitation_type; + } + + void result(const LLSD& content) + { + if ( gIMMgr) + { + LLFloaterIMPanel* floaterp = + gIMMgr->findFloaterBySession(mSessionID); + + if (floaterp) + { + //we've accepted our invitation + //and received a list of agents that were + //currently in the session when the reply was sent + //to us. Now, it is possible that there were some agents + //to slip in/out between when that message was sent to us + //and now. + + //the agent list updates we've received have been + //accurate from the time we were added to the session + //but unfortunately, our base that we are receiving here + //may not be the most up to date. It was accurate at + //some point in time though. + floaterp->setSpeakers(content); + + //we now have our base of users in the session + //that was accurate at some point, but maybe not now + //so now we apply all of the udpates we've received + //in case of race conditions + floaterp->updateSpeakersList( + gIMMgr->getPendingAgentListUpdates(mSessionID)); + + if ( mInvitiationType == LLIMMgr::INVITATION_TYPE_VOICE ) + { + floaterp->requestAutoConnect(); + LLFloaterIMPanel::onClickStartCall(floaterp); + // always open IM window when connecting to voice + LLFloaterChatterBox::showInstance(TRUE); + } + else if ( mInvitiationType == LLIMMgr::INVITATION_TYPE_IMMEDIATE ) + { + LLFloaterChatterBox::showInstance(TRUE); + } + } + + gIMMgr->clearPendingAgentListUpdates(mSessionID); + gIMMgr->clearPendingInviation(mSessionID); + } + } + + void error(U32 statusNum, const std::string& reason) + { + //throw something back to the viewer here? + if ( gIMMgr ) + { + gIMMgr->clearPendingAgentListUpdates(mSessionID); + gIMMgr->clearPendingInviation(mSessionID); + + LLFloaterIMPanel* floaterp = + gIMMgr->findFloaterBySession(mSessionID); + + if ( floaterp ) + { + if ( 404 == statusNum ) + { + std::string error_string; + error_string = "does not exist"; + + floaterp->showSessionStartError( + error_string); + } + } + } + } + +private: + LLUUID mSessionID; + LLIMMgr::EInvitationType mInvitiationType; +}; + +//static +void LLIMMgr::inviteUserResponse(S32 option, void* user_data) +{ + LLIMSessionInvite* invitep = (LLIMSessionInvite*)user_data; + + switch(option) + { + case 0: // accept + { + if (invitep->mType == IM_SESSION_P2P_INVITE) + { + // create a normal IM session + invitep->mSessionID = gIMMgr->addP2PSession( + invitep->mSessionName, + invitep->mCallerID, + invitep->mSessionHandle, + invitep->mSessionURI ); + + LLFloaterIMPanel* im_floater = + gIMMgr->findFloaterBySession( + invitep->mSessionID); + if (im_floater) + { + im_floater->requestAutoConnect(); + LLFloaterIMPanel::onClickStartCall(im_floater); + // always open IM window when connecting to voice + LLFloaterChatterBox::showInstance(invitep->mSessionID); + } + + gIMMgr->clearPendingAgentListUpdates(invitep->mSessionID); + gIMMgr->clearPendingInviation(invitep->mSessionID); + } + else + { + gIMMgr->addSession( + invitep->mSessionName, + invitep->mType, + invitep->mSessionID); + + std::string url = gAgent.getRegion()->getCapability( + "ChatSessionRequest"); + + LLSD data; + data["method"] = "accept invitation"; + data["session-id"] = invitep->mSessionID; + LLHTTPClient::post( + url, + data, + new LLViewerChatterBoxInvitationAcceptResponder( + invitep->mSessionID, + invitep->mInvType)); + } + } + break; + case 2: // mute (also implies ignore, so this falls through to the "ignore" case below) + { + // mute the sender of this invite + if (!LLMuteList::getInstance()->isMuted(invitep->mCallerID)) + { + LLMute mute(invitep->mCallerID, invitep->mCallerName, LLMute::AGENT); + LLMuteList::getInstance()->add(mute); + } + } + /* FALLTHROUGH */ + + case 1: // decline + { + if (invitep->mType == IM_SESSION_P2P_INVITE) + { + if(gVoiceClient) + { + gVoiceClient->declineInvite(invitep->mSessionHandle); + } + } + else + { + std::string url = gAgent.getRegion()->getCapability( + "ChatSessionRequest"); + + LLSD data; + data["method"] = "decline invitation"; + data["session-id"] = invitep->mSessionID; + LLHTTPClient::post( + url, + data, + NULL); + } + } + + gIMMgr->clearPendingAgentListUpdates(invitep->mSessionID); + gIMMgr->clearPendingInviation(invitep->mSessionID); + break; + } + + delete invitep; +} + +void LLIMMgr::refresh() +{ +} + +void LLIMMgr::setFloaterOpen(BOOL set_open) +{ + if (set_open) + { + LLFloaterChatterBox::showInstance(); + } + else + { + LLFloaterChatterBox::hideInstance(); + } +} + + +BOOL LLIMMgr::getFloaterOpen() +{ + return LLFloaterChatterBox::instanceVisible(LLSD()); +} + +void LLIMMgr::disconnectAllSessions() +{ + LLFloaterIMPanel* floater = NULL; + std::set >::iterator handle_it; + for(handle_it = mFloaters.begin(); + handle_it != mFloaters.end(); + ) + { + floater = (LLFloaterIMPanel*)handle_it->get(); + + // MUST do this BEFORE calling floater->onClose() because that may remove the item from the set, causing the subsequent increment to crash. + ++handle_it; + + if (floater) + { + floater->setEnabled(FALSE); + floater->close(TRUE); + } + } +} + + +// This method returns the im panel corresponding to the uuid +// provided. The uuid can either be a session id or an agent +// id. Returns NULL if there is no matching panel. +LLFloaterIMPanel* LLIMMgr::findFloaterBySession(const LLUUID& session_id) +{ + LLFloaterIMPanel* rv = NULL; + std::set >::iterator handle_it; + for(handle_it = mFloaters.begin(); + handle_it != mFloaters.end(); + ++handle_it) + { + rv = (LLFloaterIMPanel*)handle_it->get(); + if(rv && session_id == rv->getSessionID()) + { + break; + } + rv = NULL; + } + return rv; +} + + +BOOL LLIMMgr::hasSession(const LLUUID& session_id) +{ + return (findFloaterBySession(session_id) != NULL); +} + +void LLIMMgr::clearPendingInviation(const LLUUID& session_id) +{ + if ( mPendingInvitations.has(session_id.asString()) ) + { + mPendingInvitations.erase(session_id.asString()); + } +} + +LLSD LLIMMgr::getPendingAgentListUpdates(const LLUUID& session_id) +{ + if ( mPendingAgentListUpdates.has(session_id.asString()) ) + { + return mPendingAgentListUpdates[session_id.asString()]; + } + else + { + return LLSD(); + } +} + +void LLIMMgr::addPendingAgentListUpdates( + const LLUUID& session_id, + const LLSD& updates) +{ + LLSD::map_const_iterator iter; + + if ( !mPendingAgentListUpdates.has(session_id.asString()) ) + { + //this is a new agent list update for this session + mPendingAgentListUpdates[session_id.asString()] = LLSD::emptyMap(); + } + + if ( + updates.has("agent_updates") && + updates["agent_updates"].isMap() && + updates.has("updates") && + updates["updates"].isMap() ) + { + //new school update + LLSD update_types = LLSD::emptyArray(); + LLSD::array_iterator array_iter; + + update_types.append("agent_updates"); + update_types.append("updates"); + + for ( + array_iter = update_types.beginArray(); + array_iter != update_types.endArray(); + ++array_iter) + { + //we only want to include the last update for a given agent + for ( + iter = updates[array_iter->asString()].beginMap(); + iter != updates[array_iter->asString()].endMap(); + ++iter) + { + mPendingAgentListUpdates[session_id.asString()][array_iter->asString()][iter->first] = + iter->second; + } + } + } + else if ( + updates.has("updates") && + updates["updates"].isMap() ) + { + //old school update where the SD contained just mappings + //of agent_id -> "LEAVE"/"ENTER" + + //only want to keep last update for each agent + for ( + iter = updates["updates"].beginMap(); + iter != updates["updates"].endMap(); + ++iter) + { + mPendingAgentListUpdates[session_id.asString()]["updates"][iter->first] = + iter->second; + } + } +} + +void LLIMMgr::clearPendingAgentListUpdates(const LLUUID& session_id) +{ + if ( mPendingAgentListUpdates.has(session_id.asString()) ) + { + mPendingAgentListUpdates.erase(session_id.asString()); + } +} + +// create a floater and update internal representation for +// consistency. Returns the pointer, caller (the class instance since +// it is a private method) is not responsible for deleting the +// pointer. Add the floater to this but do not select it. +LLFloaterIMPanel* LLIMMgr::createFloater( + const LLUUID& session_id, + const LLUUID& other_participant_id, + const std::string& session_label, + EInstantMessage dialog, + BOOL user_initiated) +{ + if (session_id.isNull()) + { + llwarns << "Creating LLFloaterIMPanel with null session ID" << llendl; + } + + llinfos << "LLIMMgr::createFloater: from " << other_participant_id + << " in session " << session_id << llendl; + LLFloaterIMPanel* floater = new LLFloaterIMPanel(session_label, + session_id, + other_participant_id, + dialog); + LLTabContainer::eInsertionPoint i_pt = user_initiated ? LLTabContainer::RIGHT_OF_CURRENT : LLTabContainer::END; + LLFloaterChatterBox::getInstance(LLSD())->addFloater(floater, FALSE, i_pt); + mFloaters.insert(floater->getHandle()); + return floater; +} + +LLFloaterIMPanel* LLIMMgr::createFloater( + const LLUUID& session_id, + const LLUUID& other_participant_id, + const std::string& session_label, + const LLDynamicArray& ids, + EInstantMessage dialog, + BOOL user_initiated) +{ + if (session_id.isNull()) + { + llwarns << "Creating LLFloaterIMPanel with null session ID" << llendl; + } + + llinfos << "LLIMMgr::createFloater: from " << other_participant_id + << " in session " << session_id << llendl; + LLFloaterIMPanel* floater = new LLFloaterIMPanel(session_label, + session_id, + other_participant_id, + ids, + dialog); + LLTabContainer::eInsertionPoint i_pt = user_initiated ? LLTabContainer::RIGHT_OF_CURRENT : LLTabContainer::END; + LLFloaterChatterBox::getInstance(LLSD())->addFloater(floater, FALSE, i_pt); + mFloaters.insert(floater->getHandle()); + return floater; +} + +void LLIMMgr::noteOfflineUsers( + LLFloaterIMPanel* floater, + const LLDynamicArray& ids) +{ + S32 count = ids.count(); + if(count == 0) + { + floater->addHistoryLine(sOnlyUserMessage, gSavedSettings.getColor4("SystemChatColor")); + } + else + { + const LLRelationship* info = NULL; + LLAvatarTracker& at = LLAvatarTracker::instance(); + for(S32 i = 0; i < count; ++i) + { + info = at.getBuddyInfo(ids.get(i)); + std::string first, last; + if(info && !info->isOnline() + && gCacheName->getName(ids.get(i), first, last)) + { + LLUIString offline = sOfflineMessage; + offline.setArg("[FIRST]", first); + offline.setArg("[LAST]", last); + floater->addHistoryLine(offline, gSavedSettings.getColor4("SystemChatColor")); + } + } + } +} + +void LLIMMgr::noteMutedUsers(LLFloaterIMPanel* floater, + const LLDynamicArray& ids) +{ + // Don't do this if we don't have a mute list. + LLMuteList *ml = LLMuteList::getInstance(); + if( !ml ) + { + return; + } + + S32 count = ids.count(); + if(count > 0) + { + for(S32 i = 0; i < count; ++i) + { + if( ml->isMuted(ids.get(i)) ) + { + LLUIString muted = sMutedMessage; + floater->addHistoryLine(muted); + break; + } + } + } +} + +void LLIMMgr::processIMTypingStart(const LLIMInfo* im_info) +{ + processIMTypingCore(im_info, TRUE); +} + +void LLIMMgr::processIMTypingStop(const LLIMInfo* im_info) +{ + processIMTypingCore(im_info, FALSE); +} + +void LLIMMgr::processIMTypingCore(const LLIMInfo* im_info, BOOL typing) +{ + LLUUID session_id = computeSessionID(im_info->mIMType, im_info->mFromID); + LLFloaterIMPanel* floater = findFloaterBySession(session_id); + if (floater) + { + floater->processIMTyping(im_info, typing); + } +} + +void LLIMMgr::updateFloaterSessionID( + const LLUUID& old_session_id, + const LLUUID& new_session_id) +{ + LLFloaterIMPanel* floater = findFloaterBySession(old_session_id); + if (floater) + { + floater->sessionInitReplyReceived(new_session_id); + } +} + +LLFloaterChatterBox* LLIMMgr::getFloater() +{ + return LLFloaterChatterBox::getInstance(LLSD()); +} + +class LLViewerChatterBoxSessionStartReply : public LLHTTPNode +{ +public: + virtual void describe(Description& desc) const + { + desc.shortInfo("Used for receiving a reply to a request to initialize an ChatterBox session"); + desc.postAPI(); + desc.input( + "{\"client_session_id\": UUID, \"session_id\": UUID, \"success\" boolean, \"reason\": string"); + desc.source(__FILE__, __LINE__); + } + + virtual void post(ResponsePtr response, + const LLSD& context, + const LLSD& input) const + { + LLSD body; + LLUUID temp_session_id; + LLUUID session_id; + bool success; + + body = input["body"]; + success = body["success"].asBoolean(); + temp_session_id = body["temp_session_id"].asUUID(); + + if ( success ) + { + session_id = body["session_id"].asUUID(); + gIMMgr->updateFloaterSessionID( + temp_session_id, + session_id); + LLFloaterIMPanel* floaterp = gIMMgr->findFloaterBySession(session_id); + if (floaterp) + { + floaterp->setSpeakers(body); + + //apply updates we've possibly received previously + floaterp->updateSpeakersList( + gIMMgr->getPendingAgentListUpdates(session_id)); + + if ( body.has("session_info") ) + { + floaterp->processSessionUpdate(body["session_info"]); + } + + //aply updates we've possibly received previously + floaterp->updateSpeakersList( + gIMMgr->getPendingAgentListUpdates(session_id)); + } + gIMMgr->clearPendingAgentListUpdates(session_id); + } + else + { + //throw an error dialog and close the temp session's + //floater + LLFloaterIMPanel* floater = + gIMMgr->findFloaterBySession(temp_session_id); + + if ( floater ) + { + floater->showSessionStartError(body["error"].asString()); + } + } + + gIMMgr->clearPendingAgentListUpdates(session_id); + } +}; + +class LLViewerChatterBoxSessionEventReply : public LLHTTPNode +{ +public: + virtual void describe(Description& desc) const + { + desc.shortInfo("Used for receiving a reply to a ChatterBox session event"); + desc.postAPI(); + desc.input( + "{\"event\": string, \"reason\": string, \"success\": boolean, \"session_id\": UUID"); + desc.source(__FILE__, __LINE__); + } + + virtual void post(ResponsePtr response, + const LLSD& context, + const LLSD& input) const + { + LLUUID session_id; + bool success; + + LLSD body = input["body"]; + success = body["success"].asBoolean(); + session_id = body["session_id"].asUUID(); + + if ( !success ) + { + //throw an error dialog + LLFloaterIMPanel* floater = + gIMMgr->findFloaterBySession(session_id); + + if (floater) + { + floater->showSessionEventError( + body["event"].asString(), + body["error"].asString()); + } + } + } +}; + +class LLViewerForceCloseChatterBoxSession: public LLHTTPNode +{ +public: + virtual void post(ResponsePtr response, + const LLSD& context, + const LLSD& input) const + { + LLUUID session_id; + std::string reason; + + session_id = input["body"]["session_id"].asUUID(); + reason = input["body"]["reason"].asString(); + + LLFloaterIMPanel* floater = + gIMMgr ->findFloaterBySession(session_id); + + if ( floater ) + { + floater->showSessionForceClose(reason); + } + } +}; + +class LLViewerChatterBoxSessionAgentListUpdates : public LLHTTPNode +{ +public: + virtual void post( + ResponsePtr responder, + const LLSD& context, + const LLSD& input) const + { + LLFloaterIMPanel* floaterp = gIMMgr->findFloaterBySession(input["body"]["session_id"].asUUID()); + if (floaterp) + { + floaterp->updateSpeakersList( + input["body"]); + } + else + { + //we don't have a floater yet..something went wrong + //we are probably receiving an update here before + //a start or an acceptance of an invitation. Race condition. + gIMMgr->addPendingAgentListUpdates( + input["body"]["session_id"].asUUID(), + input["body"]); + } + } +}; + +class LLViewerChatterBoxSessionUpdate : public LLHTTPNode +{ +public: + virtual void post( + ResponsePtr responder, + const LLSD& context, + const LLSD& input) const + { + LLFloaterIMPanel* floaterp = gIMMgr->findFloaterBySession(input["body"]["session_id"].asUUID()); + if (floaterp) + { + floaterp->processSessionUpdate(input["body"]["info"]); + } + } +}; + + +class LLViewerChatterBoxInvitation : public LLHTTPNode +{ +public: + + virtual void post( + ResponsePtr response, + const LLSD& context, + const LLSD& input) const + { + //for backwards compatiblity reasons...we need to still + //check for 'text' or 'voice' invitations...bleh + if ( input["body"].has("instantmessage") ) + { + LLSD message_params = + input["body"]["instantmessage"]["message_params"]; + + //do something here to have the IM invite behave + //just like a normal IM + //this is just replicated code from process_improved_im + //and should really go in it's own function -jwolk + if (gNoRender) + { + return; + } + LLChat chat; + + std::string message = message_params["message"].asString(); + std::string name = message_params["from_name"].asString(); + LLUUID from_id = message_params["from_id"].asUUID(); + LLUUID session_id = message_params["id"].asUUID(); + std::vector bin_bucket = message_params["data"]["binary_bucket"].asBinary(); + U8 offline = (U8)message_params["offline"].asInteger(); + + time_t timestamp = + (time_t) message_params["timestamp"].asInteger(); + + BOOL is_busy = gAgent.getBusy(); + BOOL is_muted = LLMuteList::getInstance()->isMuted( + from_id, + name, + LLMute::flagTextChat); + + BOOL is_linden = LLMuteList::getInstance()->isLinden(name); + std::string separator_string(": "); + int message_offset=0; + + //Handle IRC styled /me messages. + std::string prefix = message.substr(0, 4); + if (prefix == "/me " || prefix == "/me'") + { + separator_string = ""; + message_offset = 3; + } + + chat.mMuted = is_muted && !is_linden; + chat.mFromID = from_id; + chat.mFromName = name; + + if (!is_linden && (is_busy || is_muted)) + { + return; + } +//MK + if (RRenabled && gAgent.mRRInterface.containsWithoutException ("recvim")) + { + return; + } +//mk + // standard message, not from system + std::string saved; + if(offline == IM_OFFLINE) + { + saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str()); + } + std::string buffer = separator_string + saved + message.substr(message_offset); + + BOOL is_this_agent = FALSE; + if(from_id == gAgentID || gSavedSettings.getBOOL("HideIMInChat")) + { + is_this_agent = TRUE; + } + gIMMgr->addMessage( + session_id, + from_id, + name, + buffer, + std::string((char*)&bin_bucket[0]), + IM_SESSION_INVITE, + message_params["parent_estate_id"].asInteger(), + message_params["region_id"].asUUID(), + ll_vector3_from_sd(message_params["position"]), + true); + + chat.mText = std::string("IM: ") + name + separator_string + saved + message.substr(message_offset); + LLFloaterChat::addChat(chat, TRUE, is_this_agent); + + //K now we want to accept the invitation + std::string url = gAgent.getRegion()->getCapability( + "ChatSessionRequest"); + + if ( url != "" ) + { + LLSD data; + data["method"] = "accept invitation"; + data["session-id"] = session_id; + LLHTTPClient::post( + url, + data, + new LLViewerChatterBoxInvitationAcceptResponder( + session_id, + LLIMMgr::INVITATION_TYPE_INSTANT_MESSAGE)); + } + } //end if invitation has instant message + else if ( input["body"].has("voice") ) + { + if (gNoRender) + { + return; + } + + if(!LLVoiceClient::voiceEnabled()) + { + // Don't display voice invites unless the user has voice enabled. + return; + } + + gIMMgr->inviteToSession( + input["body"]["session_id"].asUUID(), + input["body"]["session_name"].asString(), + input["body"]["from_id"].asUUID(), + input["body"]["from_name"].asString(), + IM_SESSION_INVITE, + LLIMMgr::INVITATION_TYPE_VOICE); + } + else if ( input["body"].has("immediate") ) + { + gIMMgr->inviteToSession( + input["body"]["session_id"].asUUID(), + input["body"]["session_name"].asString(), + input["body"]["from_id"].asUUID(), + input["body"]["from_name"].asString(), + IM_SESSION_INVITE, + LLIMMgr::INVITATION_TYPE_IMMEDIATE); + } + } +}; + +LLHTTPRegistration + gHTTPRegistrationMessageChatterboxsessionstartreply( + "/message/ChatterBoxSessionStartReply"); + +LLHTTPRegistration + gHTTPRegistrationMessageChatterboxsessioneventreply( + "/message/ChatterBoxSessionEventReply"); + +LLHTTPRegistration + gHTTPRegistrationMessageForceclosechatterboxsession( + "/message/ForceCloseChatterBoxSession"); + +LLHTTPRegistration + gHTTPRegistrationMessageChatterboxsessionagentlistupdates( + "/message/ChatterBoxSessionAgentListUpdates"); + +LLHTTPRegistration + gHTTPRegistrationMessageChatterBoxSessionUpdate( + "/message/ChatterBoxSessionUpdate"); + +LLHTTPRegistration + gHTTPRegistrationMessageChatterBoxInvitation( + "/message/ChatterBoxInvitation"); + diff --git a/linden/indra/newview/llinventorybridge.cpp b/linden/indra/newview/llinventorybridge.cpp index 6d2c9a2..d3bb7d7 100644 --- a/linden/indra/newview/llinventorybridge.cpp +++ b/linden/indra/newview/llinventorybridge.cpp @@ -86,6 +86,10 @@ #include "llselectmgr.h" #include "llfloateropenobject.h" +//MK +extern BOOL RRenabled; +//mk + // Helpers // bug in busy count inc/dec right now, logic is complex... do we really need it? void inc_busy_count() @@ -1815,10 +1819,11 @@ void LLFolderBridge::folderOptionsMenu() LLIsType is_object( LLAssetType::AT_OBJECT ); LLIsType is_gesture( LLAssetType::AT_GESTURE ); - if (mWearables || +//MK + if (!RRenabled && (mWearables || checkFolderForContentsOfType(model, is_wearable) || checkFolderForContentsOfType(model, is_object) || - checkFolderForContentsOfType(model, is_gesture) ) + checkFolderForContentsOfType(model, is_gesture)) ) { mItems.push_back(std::string("Folder Wearables Separator")); @@ -1831,6 +1836,7 @@ void LLFolderBridge::folderOptionsMenu() } mItems.push_back(std::string("Take Off Items")); } +//mk hideContextEntries(*mMenu, mItems, disabled_items); } @@ -1856,7 +1862,16 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) if(!model) return; LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); - +//MK + // Not only this is needed for RestrainedLife, but this also fixes + // a regular viewer bug. + // We need to clear the context menu, or some menu items would not refresh + // when objects are locked/unlocked (RestrainedLife), or worn/unworn or + // attached/detached (regular viewers) and the context menu is pulled down + // in-between. + mItems.clear(); + mDisabledItems.clear(); +//mk if (lost_and_found_id == mUUID) { // This is the lost+found folder. @@ -1936,6 +1951,26 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) mWearables=TRUE; } +//MK + if (RRenabled && mWearables) + { + mItems.push_back("Folder Wearables Separator"); + mItems.push_back("Add To Outfit"); + mItems.push_back("Replace Outfit"); + mItems.push_back("Take Off Items"); + // Note : After some tests, it seems we can't rely on testing whether any item within this folder is locked, because + // it may have not been fetched from the server yet, and appear empty to the viewer, hence making it think + // nothing is locked and return a false negative. Therefore we must condition the following menu items to + // whether something is locked or not. + if (gAgent.mRRInterface.mContainsDetach) + { + mDisabledItems.push_back("Add To Outfit"); + mDisabledItems.push_back("Replace Outfit"); + mDisabledItems.push_back("Take Off Items"); + } + } +//mk + mMenu = &menu; sSelf = this; LLRightClickInventoryFetchDescendentsObserver* fetch = new LLRightClickInventoryFetchDescendentsObserver(FALSE); @@ -2374,6 +2409,12 @@ void open_texture(const LLUUID& item_id, const LLUUID& source_id, BOOL take_focus) { +//MK + if (RRenabled && gAgent.mRRInterface.contains ("viewtexture")) + { + return; + } +//mk // See if we can bring an exiting preview to the front if( !LLPreview::show( item_id, take_focus ) ) { @@ -2869,6 +2910,11 @@ void open_notecard(LLViewerInventoryItem* inv_item, const LLUUID& source_id, BOOL take_focus) { +//MK + if (RRenabled && gAgent.mRRInterface.contains ("viewnote")) { + return; + } +//mk // See if we can bring an existing preview to the front if(!LLPreview::show(inv_item->getUUID(), take_focus)) { @@ -3194,7 +3240,35 @@ void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model item = (LLViewerInventoryItem*)gInventory.getItem(object_id); if(item && gInventory.isObjectDescendentOf(object_id, gAgent.getInventoryRootID())) { - rez_attachment(item, NULL); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsDetach) + { + LLViewerJointAttachment* attachmentp = NULL; + // if it's a no-mod item, the containing folder has priority to decide where to wear it + if (!item->getPermissions().allowModifyBy(gAgent.getID())) + { + attachmentp = gAgent.mRRInterface.findAttachmentPointFromParentName (item); + if (attachmentp) rez_attachment(item, attachmentp); + else + { + // but the name itself could also have the information => check + attachmentp = gAgent.mRRInterface.findAttachmentPointFromName (item->getName()); + if (attachmentp) rez_attachment(item, attachmentp); + else if (!gAgent.mRRInterface.mContainsDefaultwear && gSavedSettings.getBOOL("RestrainedLifeAllowWear")) rez_attachment(item, NULL); + } + } + else + { + // this is a mod item, wear it according to its name + attachmentp = gAgent.mRRInterface.findAttachmentPointFromName (item->getName()); + if (attachmentp) rez_attachment(item, attachmentp); + else if (!gAgent.mRRInterface.mContainsDefaultwear && gSavedSettings.getBOOL("RestrainedLifeAllowWear")) rez_attachment(item, NULL); + + } + } + else +//mk + rez_attachment(item, NULL); } else if(item && item->isComplete()) { @@ -3246,6 +3320,12 @@ void LLObjectBridge::openItem() } if (avatar->isWearingAttachment(mUUID)) { +//MK + if (RRenabled && !gAgent.mRRInterface.canDetach(avatar->getWornAttachment(mUUID))) + { + return; + } +//mk performAction(NULL, NULL, "detach"); } else @@ -3302,11 +3382,25 @@ void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attach rez_action->mAttachPt = attach_pt; if (attachment && attachment->getObject()) { +//MK + if (!RRenabled || gAgent.mRRInterface.canAttach(NULL, attachment->getName()) && gAgent.mRRInterface.canDetach(attachment->getObject())) + { +//mk gViewerWindow->alertXml("ReplaceAttachment", confirm_replace_attachment_rez, (void*)rez_action); +//MK + } +//mk } else { +//MK + if (!RRenabled || !attachment || (attachment && gAgent.mRRInterface.canAttach(NULL, attachment->getName()))) + { +//mk confirm_replace_attachment_rez(0/*YES*/, (void*)rez_action); +//MK + } +//mk } } @@ -3375,12 +3469,27 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) if( avatarp->isWearingAttachment( mUUID ) ) { items.push_back(std::string("Detach From Yourself")); +//MK + if (RRenabled && !gAgent.mRRInterface.canDetach(avatarp->getWornAttachment(mUUID))) + { + disabled_items.push_back(std::string("Detach From Yourself")); + } +//mk } else if( !isInTrash() ) { items.push_back(std::string("Attach Separator")); items.push_back(std::string("Object Wear")); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsDetach + && (gAgent.mRRInterface.mContainsDefaultwear || !gSavedSettings.getBOOL("RestrainedLifeAllowWear")) + && gAgent.mRRInterface.findAttachmentPointFromName (item->getName()) == NULL + && gAgent.mRRInterface.findAttachmentPointFromParentName (item) == NULL) + { + disabled_items.push_back(std::string("Object Wear")); + } +//mk items.push_back(std::string("Attach To")); items.push_back(std::string("Attach To HUD")); @@ -3471,6 +3580,12 @@ LLUIImagePtr LLLSLTextBridge::getIcon() const void LLLSLTextBridge::openItem() { +//MK + if (RRenabled && gAgent.mRRInterface.contains ("viewscript")) + { + return; + } +//mk // See if we can bring an exiting preview to the front if(!LLPreview::show(mUUID)) { diff --git a/linden/indra/newview/llinventorybridge.h b/linden/indra/newview/llinventorybridge.h index 4b20dcf..e0eb349 100644 --- a/linden/indra/newview/llinventorybridge.h +++ b/linden/indra/newview/llinventorybridge.h @@ -197,7 +197,9 @@ class LLInvFVBridge : public LLFolderViewEventListener // LLInvFVBridge functionality virtual void clearDisplayName() {} -protected: +//MK +////protected: +//mk LLInvFVBridge(LLInventoryPanel* inventory, const LLUUID& uuid) : mInventoryPanel(inventory), mUUID(uuid), mInvType(LLInventoryType::IT_NONE) {} diff --git a/linden/indra/newview/llinventorymodel.cpp b/linden/indra/newview/llinventorymodel.cpp index 1029a3c..6eae976 100644 --- a/linden/indra/newview/llinventorymodel.cpp +++ b/linden/indra/newview/llinventorymodel.cpp @@ -65,6 +65,12 @@ #include "process.h" #endif +//MK +#include "llviewercontrol.h" + +extern BOOL RRenabled; +//mk + BOOL LLInventoryModel::sBackgroundFetchActive = FALSE; BOOL LLInventoryModel::sAllFoldersFetched = FALSE; BOOL LLInventoryModel::sFullFetchStarted = FALSE; @@ -2774,6 +2780,20 @@ void LLInventoryModel::processUpdateInventoryFolder(LLMessageSystem* msg, // make sure it's not a protected folder tfolder->setPreferredType(LLAssetType::AT_NONE); folders.push_back(tfolder); +//MK + if (RRenabled && gAgent.mRRInterface.getRlvShare() && + !gSavedSettings.getBOOL("RestrainedLifeForbidGiveToRLV")) + { + std::string folder_name = tfolder->getName(); + if(folder_name.find(RR_RLV_REDIR_FOLDER_PREFIX) == 0) + { + folder_name.erase(0, RR_HRLVS_LENGTH); + tfolder->rename(folder_name); + tfolder->updateServer(FALSE); + } + } +//mk + // examine update for changes. LLViewerInventoryCategory* folderp = gInventory.getCategory(tfolder->getUUID()); if(folderp) @@ -2918,6 +2938,19 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**) // << llendl; if(tfolder->getUUID().notNull()) { +//MK + if (RRenabled && gAgent.mRRInterface.getRlvShare() && + !gSavedSettings.getBOOL("RestrainedLifeForbidGiveToRLV")) + { + std::string folder_name = tfolder->getName(); + if(folder_name.find(RR_RLV_REDIR_FOLDER_PREFIX) == 0) + { + folder_name.erase(0, RR_HRLVS_LENGTH); + tfolder->rename(folder_name); + tfolder->updateServer(FALSE); + } + } +//mk folders.push_back(tfolder); LLViewerInventoryCategory* folderp = gInventory.getCategory(tfolder->getUUID()); if(folderp) diff --git a/linden/indra/newview/llinventorymodel.h b/linden/indra/newview/llinventorymodel.h index 7c7d231..6deb5fe 100644 --- a/linden/indra/newview/llinventorymodel.h +++ b/linden/indra/newview/llinventorymodel.h @@ -374,8 +374,9 @@ class LLInventoryModel static bool isEverythingFetched(); static void backgroundFetch(void*); // background fetch idle function static void incrBulkFetch(S16 fetching) { sBulkFetchCount+=fetching; if (sBulkFetchCount<0) sBulkFetchCount=0; } -protected: - +//MK +////protected: +//mk // Internal methods which add inventory and make sure that all of // the internal data structures are consistent. These methods // should be passed pointers of newly created objects, and the @@ -425,8 +426,11 @@ class LLInventoryModel cat_array_t* getUnlockedCatArray(const LLUUID& id); item_array_t* getUnlockedItemArray(const LLUUID& id); -protected: - // Varaibles used to track what has changed since the last notify. +//MK +////protected: +public: +//mk + // Variables used to track what has changed since the last notify. U32 mModifyMask; typedef std::set changed_items_t; changed_items_t mChangedItemIDs; diff --git a/linden/indra/newview/llinventoryview.cpp b/linden/indra/newview/llinventoryview.cpp index 10fab18..cd8e5ef 100644 --- a/linden/indra/newview/llinventoryview.cpp +++ b/linden/indra/newview/llinventoryview.cpp @@ -86,6 +86,10 @@ static LLRegisterWidget r("inventory_panel"); +//MK +extern BOOL RRenabled; +//mk + LLDynamicArray LLInventoryView::sActiveViews; //BOOL LLInventoryView::sOpenNextNewItem = FALSE; @@ -801,6 +805,12 @@ LLInventoryView* LLInventoryView::showAgentInventory(BOOL take_keyboard_focus) return NULL; } +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowinv) { + return NULL; + } +//mk + LLInventoryView* iv = LLInventoryView::getActiveInventory(); #if 0 && !LL_RELEASE_FOR_DOWNLOAD if (sActiveViews.count() == 1) @@ -863,6 +873,11 @@ LLInventoryView* LLInventoryView::getActiveInventory() // static void LLInventoryView::toggleVisibility() { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowinv) { + return; + } +//mk S32 count = sActiveViews.count(); if (0 == count) { diff --git a/linden/indra/newview/llinventoryview.h b/linden/indra/newview/llinventoryview.h index 1880e13..e8510f9 100644 --- a/linden/indra/newview/llinventoryview.h +++ b/linden/indra/newview/llinventoryview.h @@ -274,6 +274,9 @@ friend class LLInventoryViewFinder; // This container is used to hold all active inventory views. This // is here to support the inventory toggle show button. +//MK +public: +//mk static LLDynamicArray sActiveViews; }; diff --git a/linden/indra/newview/llmaniptranslate.cpp b/linden/indra/newview/llmaniptranslate.cpp index fd02be6..83e844b 100644 --- a/linden/indra/newview/llmaniptranslate.cpp +++ b/linden/indra/newview/llmaniptranslate.cpp @@ -65,6 +65,10 @@ #include "llui.h" #include "pipeline.h" +//MK +extern BOOL RRenabled; +//mk + const S32 NUM_AXES = 3; const S32 MOUSE_DRAG_SLOP = 2; // pixels const F32 HANDLE_HIDE_ANGLE = 0.15f; // radians @@ -463,13 +467,18 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask) if (mask == MASK_COPY) { // ...we're trying to make a copy - LLSelectMgr::getInstance()->selectDuplicate(LLVector3::zero, FALSE); - mCopyMadeThisDrag = TRUE; - - // When we make the copy, we don't want to do any other processing. - // If so, the object will also be moved, and the copy will be offset. - lldebugst(LLERR_USER_INPUT) << "hover handled by LLManipTranslate (made copy)" << llendl; - gViewerWindow->setCursor(UI_CURSOR_TOOLTRANSLATE); +//MK + if (!RRenabled || !gAgent.mRRInterface.mContainsRez) + { +//mk + LLSelectMgr::getInstance()->selectDuplicate(LLVector3::zero, FALSE); + mCopyMadeThisDrag = TRUE; + + // When we make the copy, we don't want to do any other processing. + // If so, the object will also be moved, and the copy will be offset. + lldebugst(LLERR_USER_INPUT) << "hover handled by LLManipTranslate (made copy)" << llendl; + gViewerWindow->setCursor(UI_CURSOR_TOOLTRANSLATE); + } } } } diff --git a/linden/indra/newview/llmediaremotectrl.cpp b/linden/indra/newview/llmediaremotectrl.cpp index 4591700..cf34ff0 100644 --- a/linden/indra/newview/llmediaremotectrl.cpp +++ b/linden/indra/newview/llmediaremotectrl.cpp @@ -52,98 +52,46 @@ static LLRegisterWidget r("media_remote"); -LLMediaRemoteCtrl::LLMediaRemoteCtrl() +LLMediaRemoteCtrl::LLMediaRemoteCtrl(const std::string& name, + const std::string& label, + const LLRect& rect, + const std::string& xml_file) : + LLPanel(name, rect, FALSE) { setIsChrome(TRUE); setFocusRoot(TRUE); - mFactoryMap["Volume Panel"] = LLCallbackMap(createVolumePanel, NULL); - build(); -} - -void LLMediaRemoteCtrl::build() -{ - //HACK: only works because we don't have any implicit children (i.e. titlebars, close button, etc) - deleteAllChildren(); - if (gSavedSettings.getBOOL("ShowVolumeSettingsPopup")) - { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_remote_expanded.xml", &getFactoryMap()); - } - else - { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_remote.xml", &getFactoryMap()); - } + LLUICtrlFactory::getInstance()->buildPanel(this, xml_file); } BOOL LLMediaRemoteCtrl::postBuild() { - mControls = getChild("media_controls"); - llassert_always(mControls); - - childSetAction("media_play",LLOverlayBar::toggleMediaPlay,this); - childSetAction("music_play",LLOverlayBar::toggleMusicPlay,this); - childSetAction("media_stop",LLOverlayBar::mediaStop,this); - childSetAction("music_stop",LLOverlayBar::toggleMusicPlay,this); - childSetAction("media_pause",LLOverlayBar::toggleMediaPlay,this); - childSetAction("music_pause",LLOverlayBar::toggleMusicPlay,this); + childSetAction("media_play", LLOverlayBar::mediaPlay, this); + childSetAction("media_stop", LLOverlayBar::mediaStop, this); + childSetAction("media_pause", LLOverlayBar::mediaPause, this); + + childSetAction("music_play", LLOverlayBar::musicPlay, this); + childSetAction("music_stop", LLOverlayBar::musicStop, this); + childSetAction("music_pause", LLOverlayBar::musicPause, this); + + childSetAction("volume", LLOverlayBar::toggleAudioVolumeFloater, this); + childSetControlName("volume", "ShowAudioVolume"); - childSetAction("expand", onClickExpandBtn, this); return TRUE; } void LLMediaRemoteCtrl::draw() { - enableMediaButtons(); - - LLButton* expand_button = getChild("expand"); - if (expand_button) - { - if (expand_button->getToggleState()) - { - expand_button->setImageOverlay("arrow_down.tga"); - } - else - { - expand_button->setImageOverlay("arrow_up.tga"); - } - } - + enableMediaButtons(this); LLPanel::draw(); } -LLMediaRemoteCtrl::~LLMediaRemoteCtrl () +LLMediaRemoteCtrl::~LLMediaRemoteCtrl() { } -//static -void LLMediaRemoteCtrl::onClickExpandBtn(void* user_data) -{ - LLMediaRemoteCtrl* remotep = (LLMediaRemoteCtrl*)user_data; - - remotep->build(); - gOverlayBar->layoutButtons(); - -} - -//static -void* LLMediaRemoteCtrl::createVolumePanel(void* data) -{ - LLPanelAudioVolume* panel = new LLPanelAudioVolume(); - return panel; -} - -// Virtual -void LLMediaRemoteCtrl::setToolTip(const std::string& msg) -{ - std::string mime_type = LLMIMETypes::translate(LLViewerMedia::getMimeType()); - std::string tool_tip = LLMIMETypes::findToolTip(LLViewerMedia::getMimeType()); - std::string play_tip = LLMIMETypes::findPlayTip(LLViewerMedia::getMimeType()); - // childSetToolTip("media_stop", mControls->getString("stop_label") + "\n" + tool_tip); - childSetToolTip("media_icon", tool_tip); - childSetToolTip("media_play", play_tip); -} - -void LLMediaRemoteCtrl::enableMediaButtons() +// Static +void LLMediaRemoteCtrl::enableMediaButtons(LLPanel* panel) { // Media bool play_media_enabled = false; @@ -155,25 +103,19 @@ void LLMediaRemoteCtrl::enableMediaButtons() LLColor4 music_icon_color = LLUI::sColorsGroup->getColor( "IconDisabledColor" ); LLColor4 media_icon_color = LLUI::sColorsGroup->getColor( "IconDisabledColor" ); std::string media_type = "none/none"; - - // Put this in xui file - std::string media_url = mControls->getString("default_tooltip_label"); LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); - if (gSavedSettings.getBOOL("AudioStreamingVideo")) + if (gSavedSettings.getBOOL("AudioStreamingVideo") && gOverlayBar) { - if ( parcel && parcel->getMediaURL()[0]) + if (parcel && parcel->getMediaURL()[0]) { - // Set the tooltip - // Put this text into xui file - media_url = parcel->getObscureMedia() ? mControls->getString("media_hidden_label") : parcel->getMediaURL(); media_type = parcel->getMediaType(); play_media_enabled = true; media_icon_color = LLUI::sColorsGroup->getColor( "IconEnabledColor" ); LLMediaBase::EStatus status = LLViewerParcelMedia::getStatus(); - switch(status) + switch (status) { case LLMediaBase::STATUS_STOPPED: case LLMediaBase::STATUS_UNKNOWN: @@ -198,13 +140,12 @@ void LLMediaRemoteCtrl::enableMediaButtons() } } } - if (gSavedSettings.getBOOL("AudioStreamingMusic") && gAudiop) + if (gSavedSettings.getBOOL("AudioStreamingMusic") && gAudiop && gOverlayBar) { - - if ( parcel && parcel->getMusicURL()[0]) + if (parcel && parcel->getMusicURL()[0]) { play_music_enabled = true; - music_icon_color = LLUI::sColorsGroup->getColor( "IconEnabledColor" ); + music_icon_color = LLUI::sColorsGroup->getColor("IconEnabledColor"); if (gOverlayBar->musicPlaying()) { @@ -218,41 +159,35 @@ void LLMediaRemoteCtrl::enableMediaButtons() } } // if no mime type has been set disable play - if( LLViewerMedia::getMimeType().empty() - || LLViewerMedia::getMimeType() == "none/none") + if (LLViewerMedia::getMimeType().empty() || + LLViewerMedia::getMimeType() == "none/none") { play_media_enabled = false; stop_media_enabled = false; } } + const std::string media_icon_name = LLMIMETypes::findIcon(media_type); - LLButton* music_play_btn = getChild("music_play"); - LLButton* music_stop_btn = getChild("music_stop"); - LLButton* music_pause_btn = getChild("music_pause"); - LLButton* media_play_btn = getChild("media_play"); - LLButton* media_stop_btn = getChild("media_stop"); - LLButton* media_pause_btn = getChild("media_pause"); - LLIconCtrl* media_icon = getChild("media_icon"); + LLIconCtrl* media_icon = panel->getChild("media_icon"); - music_play_btn->setEnabled(play_music_enabled); - music_stop_btn->setEnabled(stop_music_enabled); - music_pause_btn->setEnabled(music_show_pause); - music_pause_btn->setVisible(music_show_pause); - music_play_btn->setVisible(! music_show_pause); - childSetColor("music_icon", music_icon_color); - if(!media_icon_name.empty()) + panel->childSetEnabled("music_play", play_music_enabled); + panel->childSetEnabled("music_stop", stop_music_enabled); + panel->childSetEnabled("music_pause", music_show_pause); + panel->childSetVisible("music_pause", music_show_pause); + panel->childSetVisible("music_play", !music_show_pause); + + panel->childSetColor("music_icon", music_icon_color); + + if (!media_icon_name.empty() && media_icon) { media_icon->setImage(media_icon_name); } - media_play_btn->setEnabled(play_media_enabled); - media_stop_btn->setEnabled(stop_media_enabled); - media_pause_btn->setEnabled(media_show_pause); - media_pause_btn->setVisible(media_show_pause); - media_play_btn->setVisible(! media_show_pause); - childSetColor("media_icon", media_icon_color); + panel->childSetEnabled("media_play", play_media_enabled); + panel->childSetEnabled("media_stop", stop_media_enabled); + panel->childSetEnabled("media_pause", media_show_pause); + panel->childSetVisible("media_pause", media_show_pause); + panel->childSetVisible("media_play", !media_show_pause); - setToolTip(media_url); + panel->childSetColor("media_icon", media_icon_color); } - - diff --git a/linden/indra/newview/llmediaremotectrl.h b/linden/indra/newview/llmediaremotectrl.h index 2537585..66b75ba 100644 --- a/linden/indra/newview/llmediaremotectrl.h +++ b/linden/indra/newview/llmediaremotectrl.h @@ -39,23 +39,16 @@ class LLMediaRemoteCtrl : public LLPanel { public: - LLMediaRemoteCtrl (); + LLMediaRemoteCtrl(const std::string& name, + const std::string& label, + const LLRect& rect, + const std::string& xml_file); - /*virtual*/ ~LLMediaRemoteCtrl (); + /*virtual*/ ~LLMediaRemoteCtrl(); /*virtual*/ BOOL postBuild(); /*virtual*/ void draw(); - void enableMediaButtons(); - - LLPanel* mControls; - - static void onClickExpandBtn(void* user_data); - static void* createVolumePanel(void* data); - - virtual void setToolTip(const std::string& msg); - -protected: - void build(); + static void enableMediaButtons(LLPanel* panel); }; #endif diff --git a/linden/indra/newview/llmoveview.cpp b/linden/indra/newview/llmoveview.cpp index 9f11afb..ca0ffe9 100644 --- a/linden/indra/newview/llmoveview.cpp +++ b/linden/indra/newview/llmoveview.cpp @@ -94,6 +94,9 @@ LLFloaterMove::LLFloaterMove(const LLSD& key) childSetAction("move down btn",moveDown,NULL); mMoveDownButton->setHeldDownDelay(MOVE_BUTTON_DELAY); mMoveDownButton->setHeldDownCallback( moveDown ); + + mFlyButton = getChild("fly btn"); + childSetAction("fly btn",onFlyButtonClicked,NULL); } // virtual @@ -117,6 +120,12 @@ void LLFloaterMove::onOpen() gSavedSettings.setBOOL("ShowMovementControls", TRUE); } +// protected static +void LLFloaterMove::onFlyButtonClicked(void *) +{ + gAgent.toggleFlying(); +} + // protected static F32 LLFloaterMove::getYawRate( F32 time ) { diff --git a/linden/indra/newview/llmoveview.h b/linden/indra/newview/llmoveview.h index 760253e..44d94ce 100644 --- a/linden/indra/newview/llmoveview.h +++ b/linden/indra/newview/llmoveview.h @@ -55,6 +55,7 @@ class LLFloaterMove public: /*virtual*/ void onOpen(); /*virtual*/ void onClose(bool app_quitting); + static void onFlyButtonClicked(void* userdata); static F32 getYawRate(F32 time); @@ -77,6 +78,7 @@ class LLFloaterMove LLButton* mTurnRightButton; LLButton* mMoveUpButton; LLButton* mMoveDownButton; + LLButton* mFlyButton; }; diff --git a/linden/indra/newview/llnetmap.cpp b/linden/indra/newview/llnetmap.cpp index c96754f..35efc49 100644 --- a/linden/indra/newview/llnetmap.cpp +++ b/linden/indra/newview/llnetmap.cpp @@ -76,6 +76,10 @@ const F32 MAP_SCALE_INCREMENT = 16; const S32 TRACKING_RADIUS = 3; +//MK +extern BOOL RRenabled; +//mk + //static BOOL LLNetMap::sRotateMap = FALSE; LLNetMap* LLNetMap::sInstance = NULL; @@ -408,6 +412,14 @@ void LLNetMap::draw() if( i < regionp->mMapAvatarIDs.count()) { show_as_friend = is_agent_friend(regionp->mMapAvatarIDs.get(i)); +//MK + // Don't show as friend under @shownames, since it can give away an + // information about the avatars who are around + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + show_as_friend = FALSE; + } +//mk } LLWorldMapView::drawAvatar( pos_map.mV[VX], pos_map.mV[VY], @@ -591,7 +603,12 @@ BOOL LLNetMap::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* sticky_rec if( region ) { msg.assign( region->getName() ); - +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + msg.assign ("(Region hidden)"); + } +//mk #ifndef LL_RELEASE_FOR_DOWNLOAD std::string buffer; msg.append("\n"); diff --git a/linden/indra/newview/llnotify.cpp b/linden/indra/newview/llnotify.cpp index fc58142..4f149da 100644 --- a/linden/indra/newview/llnotify.cpp +++ b/linden/indra/newview/llnotify.cpp @@ -54,6 +54,12 @@ #include "lloverlaybar.h" // for gOverlayBar #include "lluictrlfactory.h" +//MK +#include "llviewerregion.h" +#include "llagent.h" +extern BOOL RRenabled; +//mk + // Globals LLNotifyBoxView* gNotifyBoxView = NULL; @@ -210,6 +216,21 @@ LLNotifyBox::LLNotifyBox(LLPointer xml_template, const LLSt option_list_t options = xml_template->mOptions; options.insert(options.end(), extra_options.begin(), extra_options.end()); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + // hide every occurrence of the Parcel name if the location restriction is active + mMessage = gAgent.mRRInterface.stringReplace (mMessage, gAgent.mRRInterface.getParcelName(), "(Parcel hidden)"); + // hide every occurrence of the Region name if the location restriction is active + mMessage = gAgent.mRRInterface.stringReplace (mMessage, gAgent.getRegion()->getName(), "(Region hidden)"); + } + + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + mMessage = gAgent.mRRInterface.getCensoredMessage(mMessage); + } +//mk + // initialize mIsTip = xml_template->mIsTip; @@ -736,7 +757,7 @@ LLRect LLNotifyBox::getNotifyTipRect(const std::string &utf8message) S32 notify_height = llceil((F32) (line_count+1) * sFont->getLineHeight()); if(gOverlayBar) { - notify_height += gOverlayBar->getBoundingRect().mTop; + notify_height += gOverlayBar->getRect().getHeight(); } else { diff --git a/linden/indra/newview/llnotify.cpp.orig b/linden/indra/newview/llnotify.cpp.orig new file mode 100644 index 0000000..20947fe --- /dev/null +++ b/linden/indra/newview/llnotify.cpp.orig @@ -0,0 +1,1074 @@ +/** + * @file llnotify.cpp + * @brief Non-blocking notification that doesn't take keyboard focus. + * + * $LicenseInfo:firstyear=2003&license=viewergpl$ + * + * Copyright (c) 2003-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llnotify.h" + +#include "llchat.h" +#include "llfocusmgr.h" +#include "llrender.h" + +#include "llbutton.h" +#include "llfocusmgr.h" +#include "llglheaders.h" +#include "lliconctrl.h" +#include "lltextbox.h" +#include "lltexteditor.h" +#include "lluiconstants.h" +#include "llui.h" +#include "llxmlnode.h" +#include "llalertdialog.h" +#include "llviewercontrol.h" +#include "llviewerdisplay.h" +#include "llviewerimagelist.h" +#include "llfloaterchat.h" // for add_chat_history() +#include "lloverlaybar.h" // for gOverlayBar +#include "lluictrlfactory.h" + +//MK +#include "llviewerregion.h" +#include "llagent.h" +extern BOOL RRenabled; +//mk + +// Globals +LLNotifyBoxView* gNotifyBoxView = NULL; + +const F32 ANIMATION_TIME = 0.333f; + +// statics +S32 LLNotifyBox::sNotifyBoxCount = 0; +const LLFontGL* LLNotifyBox::sFont = NULL; +const LLFontGL* LLNotifyBox::sFontSmall = NULL; +std::map LLNotifyBox::sOpenUniqueNotifyBoxes; +LLPointer LLNotifyBox::sDefaultTemplate; + + +LLNotifyBox::template_map_t LLNotifyBox::sNotifyTemplates; + +LLNotifyBox::LLNotifyBehavior::LLNotifyBehavior(notify_callback_t callback, void* data) : + mCallback(callback), + mData(data) +{ +} + +//--------------------------------------------------------------------------- +// LLNotifyBox +//--------------------------------------------------------------------------- + +//static +LLNotifyBox* LLNotifyBox::showXml( const std::string& xml_desc, notify_callback_t callback, void *user_data) +{ + return showXml(xml_desc, LLStringUtil::format_map_t(), callback, user_data); +} + + +//static +LLNotifyBox* LLNotifyBox::showXml( const std::string& xml_desc, const LLStringUtil::format_map_t& args, BOOL is_caution, + notify_callback_t callback, void *user_data) +{ + // for script permission prompts + LLPointer xml_template = getTemplate(xml_desc); + LLNotifyBox* notify = findExistingNotify(xml_template, args); + if (notify) + { + delete notify->mBehavior; + notify->mBehavior = new LLNotifyBehavior(callback, user_data); + } + else + { + notify = new LLNotifyBox(xml_template, args, callback, user_data, is_caution); + gNotifyBoxView->addChildAtEnd(notify); + notify->moveToBack(); + } + return notify; +} + +//static +LLNotifyBox* LLNotifyBox::showXml( const std::string& xml_desc, const LLStringUtil::format_map_t& args, + notify_callback_t callback, void *user_data) +{ + LLPointer xml_template = getTemplate(xml_desc); + LLNotifyBox* notify = findExistingNotify(xml_template, args); + if (notify) + { + delete notify->mBehavior; + notify->mBehavior = new LLNotifyBehavior(callback, user_data); + } + else + { + notify = new LLNotifyBox(xml_template, args, callback, user_data); + gNotifyBoxView->addChildAtEnd(notify); + notify->moveToBack(); + } + return notify; +} + +//static +LLNotifyBox* LLNotifyBox::showXml( const std::string& xml_desc, const LLStringUtil::format_map_t& args, + notify_callback_t callback, void *user_data, + const option_list_t& options, + BOOL layout_script_dialog) +{ + LLPointer xml_template = getTemplate(xml_desc); + LLNotifyBox* notify = findExistingNotify(xml_template, args); + if (notify) + { + delete notify->mBehavior; + notify->mBehavior = new LLNotifyBehavior(callback, user_data); + } + else + { + notify = new LLNotifyBox(xml_template, args, callback, user_data, FALSE, options, layout_script_dialog); + gNotifyBoxView->addChild(notify); + } + return notify; +} + +//static +LLNotifyBox* LLNotifyBox::findExistingNotify(LLPointer notify_template, const LLStringUtil::format_map_t &args) +{ + if(notify_template->mUnique) + { + std::string message = notify_template->mMessage; + format(message, args); + unique_map_t::iterator found_it = sOpenUniqueNotifyBoxes.find(notify_template->mLabel + message); + if (found_it != sOpenUniqueNotifyBoxes.end()) + { + return found_it->second; + } + } + return NULL; +} + +//static +void LLNotifyBox::cleanup() +{ + sDefaultTemplate = NULL; +} + +//--------------------------------------------------------------------------- + +LLNotifyBox::LLNotifyBox(LLPointer xml_template, const LLStringUtil::format_map_t& args, + notify_callback_t callback, void* user_data, BOOL is_caution, + const option_list_t& extra_options, + BOOL layout_script_dialog) + : LLPanel(xml_template->mLabel, LLRect(), BORDER_NO), + LLEventTimer(xml_template->mDuration), + mIsTip(FALSE), + mAnimating(TRUE), + mUnique(xml_template->mUnique), + mNextBtn(NULL), + mBehavior(new LLNotifyBehavior(callback, user_data)), + mNumOptions(0), + mDefaultOption(0) +{ + // clicking on a button does not steal current focus + setIsChrome(TRUE); + + // class init + if (!sFont) + { + sFont = LLFontGL::sSansSerif; + sFontSmall = LLFontGL::sSansSerifSmall; + } + + // setup paramaters + + mMessage = xml_template->mMessage; + format(mMessage, args); + + // use name + formatted text as unique key + if (mUnique) + { + sOpenUniqueNotifyBoxes[xml_template->mLabel + mMessage] = this; + } + + option_list_t options = xml_template->mOptions; + options.insert(options.end(), extra_options.begin(), extra_options.end()); + +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + // hide every occurrence of the Parcel name if the location restriction is active + mMessage = gAgent.mRRInterface.stringReplace (mMessage, gAgent.mRRInterface.getParcelName(), "(Parcel hidden)"); + // hide every occurrence of the Region name if the location restriction is active + mMessage = gAgent.mRRInterface.stringReplace (mMessage, gAgent.getRegion()->getName(), "(Region hidden)"); + } + + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + mMessage = gAgent.mRRInterface.getCensoredMessage(mMessage); + } +//mk + + // initialize + + mIsTip = xml_template->mIsTip; + setFocusRoot(!mIsTip); + + // caution flag can be set explicitly by specifying it in the + // call to the c'tor, or it can be set implicitly if the + // notify xml template specifies that it is a caution + // + // tip-style notification handle 'caution' differently - + // they display the tip in a different color + mIsCaution = (xml_template->mIsCaution || is_caution); + + // Don't animate if behind other windows + if( gNotifyBoxView->getChildCount() > 0 ) + mAnimating = FALSE; + else + mAnimating = TRUE; + + mNumOptions = options.size(); + mDefaultOption = xml_template->mDefaultOption; + + LLRect rect = mIsTip ? getNotifyTipRect(mMessage) + : getNotifyRect(mNumOptions, layout_script_dialog, mIsCaution); + setRect(rect); + setFollows(mIsTip ? (FOLLOWS_BOTTOM|FOLLOWS_RIGHT) : (FOLLOWS_TOP|FOLLOWS_RIGHT)); + setBackgroundVisible(FALSE); + setBackgroundOpaque(TRUE); + + LLIconCtrl* icon; + LLTextEditor* text; + + const S32 TOP = getRect().getHeight() - (mIsTip ? (S32)sFont->getLineHeight() : 32); + const S32 BOTTOM = (S32)sFont->getLineHeight(); + S32 x = HPAD + HPAD; + S32 y = TOP; + + if (mIsTip) + { + // use the tip notification icon + icon = new LLIconCtrl(std::string("icon"), LLRect(x, y, x+32, TOP-32), std::string("notify_tip_icon.tga")); + } + else if (mIsCaution) + { + // use the caution notification icon + icon = new LLIconCtrl(std::string("icon"), LLRect(x, y, x+32, TOP-32), std::string("notify_caution_icon.tga")); + } + else + { + // use the default notification icon + icon = new LLIconCtrl(std::string("icon"), LLRect(x, y, x+32, TOP-32), std::string("notify_box_icon.tga")); + } + + icon->setMouseOpaque(FALSE); + addChild(icon); + + x += HPAD + HPAD + 32; + + // add a caution textbox at the top of a caution notification + LLTextBox* caution_box = NULL; + if (mIsCaution && !mIsTip) + { + S32 caution_height = ((S32)sFont->getLineHeight() * 2) + VPAD; + caution_box = new LLTextBox( + std::string("caution_box"), + LLRect(x, y, getRect().getWidth() - 2, caution_height), + LLStringUtil::null, + sFont, + FALSE); + + caution_box->setFontStyle(LLFontGL::BOLD); + caution_box->setColor(gColors.getColor("NotifyCautionWarnColor")); + caution_box->setBackgroundColor(gColors.getColor("NotifyCautionBoxColor")); + caution_box->setBorderVisible(FALSE); + caution_box->setWrappedText(LLNotifyBox::getTemplateMessage("ScriptQuestionCautionWarn")); + + addChild(caution_box); + + // adjust the vertical position of the next control so that + // it appears below the caution textbox + y = y - caution_height; + } + + const S32 BOTTOM_PAD = VPAD * 3; + const S32 BTN_TOP = BOTTOM_PAD + (((mNumOptions-1+2)/3)) * (BTN_HEIGHT+VPAD); + + // Tokenization on \n is handled by LLTextBox + + const S32 MAX_LENGTH = 512 + 20 + + DB_FIRST_NAME_BUF_SIZE + + DB_LAST_NAME_BUF_SIZE + + DB_INV_ITEM_NAME_BUF_SIZE; // For script dialogs: add space for title. + + text = new LLTextEditor(std::string("box"), + LLRect(x, y, getRect().getWidth()-2, mIsTip ? BOTTOM : BTN_TOP+16), + MAX_LENGTH, + mMessage, + sFont, + FALSE); + text->setWordWrap(TRUE); + text->setTabStop(FALSE); + text->setMouseOpaque(FALSE); + text->setBorderVisible(FALSE); + text->setTakesNonScrollClicks(FALSE); + text->setHideScrollbarForShortDocs(TRUE); + text->setReadOnlyBgColor ( LLColor4::transparent ); // the background color of the box is manually + // rendered under the text box, therefore we want + // the actual text box to be transparent + text->setReadOnlyFgColor ( gColors.getColor("NotifyTextColor") ); + text->setEnabled(FALSE); // makes it read-only + text->setTabStop(FALSE); // can't tab to it (may be a problem for scrolling via keyboard) + addChild(text); + + if (mIsTip) + { + if (!gSavedSettings.getBOOL("HideNotificationsInChat")) { + // TODO: Make a separate archive for these. + LLChat chat(mMessage); + chat.mSourceType = CHAT_SOURCE_SYSTEM; + LLFloaterChat::getInstance(LLSD())->addChatHistory(chat); + } + } + else + { + LLButton* btn; + btn = new LLButton(std::string("next"), + LLRect(getRect().getWidth()-26, BOTTOM_PAD + 20, getRect().getWidth()-2, BOTTOM_PAD), + std::string("notify_next.png"), + std::string("notify_next.png"), + LLStringUtil::null, + onClickNext, + this, + sFont); + btn->setScaleImage(TRUE); + btn->setToolTip(std::string("Next")); // *TODO: Translate + addChild(btn); + mNextBtn = btn; + + // make caution notification buttons slightly narrower + // so that 3 of them can fit without overlapping the "next" button + S32 btn_width = mIsCaution? 84 : 90; + LLRect btn_rect; + + for (S32 i = 0; i < mNumOptions; i++) + { + S32 index = i; + S32 btn_height= BTN_HEIGHT; + const LLFontGL* font = sFont; + S32 ignore_pad = 0; + + if (layout_script_dialog) + { + // Add two "blank" option spaces, before the "Ignore" button + index = i + 2; + if (i == 0) + { + // Ignore button is smaller, less wide + btn_height = BTN_HEIGHT_SMALL; + font = sFontSmall; + ignore_pad = 10; + } + } + + btn_rect.setOriginAndSize(x + (index % 3) * (btn_width+HPAD+HPAD) + ignore_pad, + BOTTOM_PAD + (index / 3) * (BTN_HEIGHT+VPAD), + btn_width - 2*ignore_pad, + btn_height); + + InstanceAndS32* userdata = new InstanceAndS32; + userdata->mSelf = this; + userdata->mButton = i; + + mBtnCallbackData.push_back(userdata); + + btn = new LLButton(options[i], btn_rect, LLStringUtil::null, onClickButton, userdata); + btn->setFont(font); + + if (mIsCaution) + { + btn->setImageColor(LLUI::sColorsGroup->getColor("ButtonCautionImageColor")); + btn->setDisabledImageColor(LLUI::sColorsGroup->getColor("ButtonCautionImageColor")); + } + + addChild(btn, -1); + + if (i == mDefaultOption) + { + setDefaultBtn(btn); + } + } + + sNotifyBoxCount++; + + // If this is the only notify box, don't show the next button + if (sNotifyBoxCount == 1 + && mNextBtn) + { + mNextBtn->setVisible(FALSE); + } + } +} + +// virtual +LLNotifyBox::~LLNotifyBox() +{ + delete mBehavior; + mBehavior = NULL; + + std::for_each(mBtnCallbackData.begin(), mBtnCallbackData.end(), DeletePointer()); + + if (mUnique) + { + sOpenUniqueNotifyBoxes.erase(getName() + mMessage); + } +} + +// virtual +BOOL LLNotifyBox::handleMouseUp(S32 x, S32 y, MASK mask) +{ + if (mIsTip) + { + if (mBehavior->mCallback) + { + mBehavior->mCallback(0, mBehavior->mData); + mBehavior->mCallback = NULL; // Notification callbacks only expect to be called once ever + } + close(); + return TRUE; + } + + setFocus(TRUE); + + return LLPanel::handleMouseUp(x, y, mask); +} + +// virtual +BOOL LLNotifyBox::handleRightMouseDown(S32 x, S32 y, MASK mask) +{ + if (!mIsTip) + { + moveToBack(true); + return TRUE; + } + + return LLPanel::handleRightMouseDown(x, y, mask); +} + + +// virtual +void LLNotifyBox::draw() +{ + // If we are teleporting, stop the timer and restart it when the teleporting completes + if (gTeleportDisplay) + { + mEventTimer.stop(); + } + else if (!mEventTimer.getStarted()) + { + mEventTimer.start(); + } + + F32 display_time = mAnimateTimer.getElapsedTimeF32(); + + if (mAnimating && display_time < ANIMATION_TIME) + { + glMatrixMode(GL_MODELVIEW); + LLUI::pushMatrix(); + + S32 height = getRect().getHeight(); + F32 fraction = display_time / ANIMATION_TIME; + F32 voffset = (1.f - fraction) * height; + if (mIsTip) voffset *= -1.f; + LLUI::translate(0.f, voffset, 0.f); + + drawBackground(); + + LLPanel::draw(); + + LLUI::popMatrix(); + } + else + { + if(mAnimating) + { + mAnimating = FALSE; + if(!mIsTip) + { + // hide everyone behind me once I'm done animating + gNotifyBoxView->showOnly(this); + } + } + drawBackground(); + LLPanel::draw(); + } +} + +void LLNotifyBox::drawBackground() const +{ + LLUIImagePtr imagep = LLUI::getUIImage("rounded_square.tga"); + if (imagep) + { + gGL.getTexUnit(0)->bind(imagep->getImage()); + // set proper background color depending on whether notify box is a caution or not + LLColor4 color = mIsCaution? gColors.getColor("NotifyCautionBoxColor") : gColors.getColor("NotifyBoxColor"); + if(gFocusMgr.childHasKeyboardFocus( this )) + { + const S32 focus_width = 2; + color = gColors.getColor("FloaterFocusBorderColor"); + gGL.color4fv(color.mV); + gl_segmented_rect_2d_tex(-focus_width, getRect().getHeight() + focus_width, + getRect().getWidth() + focus_width, -focus_width, + imagep->getTextureWidth(), imagep->getTextureHeight(), + 16, mIsTip ? ROUNDED_RECT_TOP : ROUNDED_RECT_BOTTOM); + color = gColors.getColor("ColorDropShadow"); + gGL.color4fv(color.mV); + gl_segmented_rect_2d_tex(0, getRect().getHeight(), getRect().getWidth(), 0, imagep->getTextureWidth(), imagep->getTextureHeight(), 16, mIsTip ? ROUNDED_RECT_TOP : ROUNDED_RECT_BOTTOM); + + if( mIsCaution ) + color = gColors.getColor("NotifyCautionBoxColor"); + else + color = gColors.getColor("NotifyBoxColor"); + + gGL.color4fv(color.mV); + gl_segmented_rect_2d_tex(1, getRect().getHeight()-1, getRect().getWidth()-1, 1, imagep->getTextureWidth(), imagep->getTextureHeight(), 16, mIsTip ? ROUNDED_RECT_TOP : ROUNDED_RECT_BOTTOM); + } + else + { + gGL.color4fv(color.mV); + gl_segmented_rect_2d_tex(0, getRect().getHeight(), getRect().getWidth(), 0, imagep->getTextureWidth(), imagep->getTextureHeight(), 16, mIsTip ? ROUNDED_RECT_TOP : ROUNDED_RECT_BOTTOM); + } + } +} + + +void LLNotifyBox::close() +{ + BOOL isTipTmp = mIsTip; + + if (!mIsTip) + { + sNotifyBoxCount--; + } + + die(); + if(!isTipTmp) + { + LLNotifyBox * front = gNotifyBoxView->getFirstNontipBox(); + if(front) + { + gNotifyBoxView->showOnly(front); + // we're assuming that close is only called by user action (for non-tips), + // so we then give focus to the next close button + if (front->getDefaultButton()) + { + front->getDefaultButton()->setFocus(TRUE); + } + gFocusMgr.triggerFocusFlash(); // TODO it's ugly to call this here + } + } +} + +void LLNotifyBox::format(std::string& msg, const LLStringUtil::format_map_t& args) +{ + // XUI:translate! + LLStringUtil::format_map_t targs = args; + targs["[SECOND_LIFE]"] = "Second Life"; + LLStringUtil::format(msg, targs); +} + + +/*virtual*/ +BOOL LLNotifyBox::tick() +{ + if (mIsTip) + { + close(); + } + return FALSE; +} + +void LLNotifyBox::setVisible(BOOL visible) +{ + // properly set the status of the next button + if(visible && !mIsTip) + { + mNextBtn->setVisible(sNotifyBoxCount > 1); + mNextBtn->setEnabled(sNotifyBoxCount > 1); + } + LLPanel::setVisible(visible); +} + +void LLNotifyBox::moveToBack(bool getfocus) +{ + // Move this dialog to the back. + gNotifyBoxView->sendChildToBack(this); + if(!mIsTip && mNextBtn) + { + mNextBtn->setVisible(FALSE); + + // And enable the next button on the frontmost one, if there is one + if (gNotifyBoxView->getChildCount() > 0) + { + LLNotifyBox* front = gNotifyBoxView->getFirstNontipBox(); + if (front) + { + gNotifyBoxView->showOnly(front); + if (getfocus) + { + // if are called from a user interaction + // we give focus to the next next button + if (front->mNextBtn != NULL) + { + front->mNextBtn->setFocus(TRUE); + } + gFocusMgr.triggerFocusFlash(); // TODO: it's ugly to call this here + } + } + } + } +} + + +// static +LLRect LLNotifyBox::getNotifyRect(S32 num_options, BOOL layout_script_dialog, BOOL is_caution) +{ + S32 notify_height = gSavedSettings.getS32("NotifyBoxHeight"); + if (is_caution) + { + // make caution-style dialog taller to accomodate extra text, + // as well as causing the accept/decline buttons to be drawn + // in a different position, to help prevent "quick-click-through" + // of many permissions prompts + notify_height = gSavedSettings.getS32("PermissionsCautionNotifyBoxHeight"); + } + const S32 NOTIFY_WIDTH = gSavedSettings.getS32("NotifyBoxWidth"); + + const S32 TOP = gNotifyBoxView->getRect().getHeight(); + const S32 RIGHT = gNotifyBoxView->getRect().getWidth(); + const S32 LEFT = RIGHT - NOTIFY_WIDTH; + + if (num_options < 1) + { + num_options = 1; + } + + // Add two "blank" option spaces. + if (layout_script_dialog) + { + num_options += 2; + } + + S32 additional_lines = (num_options-1) / 3; + + notify_height += additional_lines * (BTN_HEIGHT + VPAD); + + return LLRect(LEFT, TOP, RIGHT, TOP-notify_height); +} + +// static +LLRect LLNotifyBox::getNotifyTipRect(const std::string &utf8message) +{ + S32 line_count = 1; + LLWString message = utf8str_to_wstring(utf8message); + S32 message_len = message.length(); + + const S32 NOTIFY_WIDTH = gSavedSettings.getS32("NotifyBoxWidth"); + // Make room for the icon area. + const S32 text_area_width = NOTIFY_WIDTH - HPAD * 4 - 32; + + const llwchar* wchars = message.c_str(); + const llwchar* start = wchars; + const llwchar* end; + S32 total_drawn = 0; + BOOL done = FALSE; + + do + { + line_count++; + + for (end=start; *end != 0 && *end != '\n'; end++) + ; + + if( *end == 0 ) + { + end = wchars + message_len; + done = TRUE; + } + + S32 remaining = end - start; + while( remaining ) + { + S32 drawn = sFont->maxDrawableChars( start, (F32)text_area_width, remaining, TRUE ); + + if( 0 == drawn ) + { + drawn = 1; // Draw at least one character, even if it doesn't all fit. (avoids an infinite loop) + } + + total_drawn += drawn; + start += drawn; + remaining -= drawn; + + if( total_drawn < message_len ) + { + if( (wchars[ total_drawn ] != '\n') ) + { + // wrap because line was too long + line_count++; + } + } + else + { + done = TRUE; + } + } + + total_drawn++; // for '\n' + end++; + start = end; + } while( !done ); + + const S32 MIN_NOTIFY_HEIGHT = 72; + const S32 MAX_NOTIFY_HEIGHT = 600; + S32 notify_height = llceil((F32) (line_count+1) * sFont->getLineHeight()); + if(gOverlayBar) + { + notify_height += gOverlayBar->getBoundingRect().mTop; + } + else + { + // *FIX: this is derived from the padding caused by the + // rounded rects, shouldn't be a const here. + notify_height += 10; + } + notify_height += VPAD; + notify_height = llclamp(notify_height, MIN_NOTIFY_HEIGHT, MAX_NOTIFY_HEIGHT); + + const S32 RIGHT = gNotifyBoxView->getRect().getWidth(); + const S32 LEFT = RIGHT - NOTIFY_WIDTH; + + // Make sure it goes slightly offscreen + return LLRect(LEFT, notify_height-1, RIGHT, -1); +} + + +// static +void LLNotifyBox::onClickButton(void* data) +{ + InstanceAndS32* self_and_button = (InstanceAndS32*)data; + LLNotifyBox* self = self_and_button->mSelf; + S32 button = self_and_button->mButton; + + // for caution notifications, check if the last button in the prompt was clicked + // unless it is the only button, in which case it will just be an "OK" button + if ((self->mIsCaution) && (button > 0) && (button == (self->mNumOptions - 1))) + { + // show an alert dialog containing more explanation about the debit permission + LLAlertDialog::showXml("DebitPermissionDetails"); + + // keep this notification open + return; + } + + if (self->mBehavior->mCallback) + { + self->mBehavior->mCallback(button, self->mBehavior->mData); + self->mBehavior->mCallback = NULL; // Notification callbacks only expect to be called once ever + } + + self->close(); +} + + +// static +void LLNotifyBox::onClickNext(void* data) +{ + LLNotifyBox* self = static_cast(data); + self->moveToBack(true); +} + +// static +LLPointer LLNotifyBox::getTemplate(const std::string& xml_desc) +{ + // get template + + if (!sDefaultTemplate) + { + // default template is non-unique, of course + sDefaultTemplate = new LLNotifyBoxTemplate(FALSE, gSavedSettings.getF32("NotifyTipDuration")); + sDefaultTemplate->addOption("OK", FALSE); + } + + LLPointer xml_template; + template_map_t::iterator iter = sNotifyTemplates.find(xml_desc); + if (iter != sNotifyTemplates.end()) + { + xml_template = iter->second; + } + else + { + std::string tmsg = "[Notification template not found:\n " + xml_desc + " ]"; + sDefaultTemplate->setMessage(tmsg); + xml_template = sDefaultTemplate; + } + + return xml_template; +} + +//----------------------------------------------------------------------------- + +//static +const std::string LLNotifyBox::getTemplateMessage(const std::string& xml_desc, const LLStringUtil::format_map_t& args) +{ + template_map_t::iterator iter = sNotifyTemplates.find(xml_desc); + if (iter != sNotifyTemplates.end()) + { + std::string message = iter->second->mMessage; + format(message, args); + return message; + } + else + { + return xml_desc; + } +} + +//static +const std::string LLNotifyBox::getTemplateMessage(const std::string& xml_desc) +{ + template_map_t::iterator iter = sNotifyTemplates.find(xml_desc); + if (iter != sNotifyTemplates.end()) + { + return iter->second->mMessage; + } + else + { + return xml_desc; + } +} + +// method to check whether a given notify template show as a caution or not +BOOL LLNotifyBox::getTemplateIsCaution(const std::string& xml_desc) +{ + BOOL is_caution = FALSE; + + template_map_t::iterator iter = sNotifyTemplates.find(xml_desc); + if (iter != sNotifyTemplates.end()) + { + is_caution = iter->second->mIsCaution; + } + + return is_caution; +} + +//static +bool LLNotifyBox::parseNotify(const std::string& xml_filename) +{ + LLXMLNodePtr root; + + BOOL success = LLUICtrlFactory::getLayeredXMLNode(xml_filename, root); + + if (!success || root.isNull() || !root->hasName( "notifications" )) + { + llerrs << "Problem reading UI Notify file: " << xml_filename << llendl; + return false; + } + + for (LLXMLNode* notify = root->getFirstChild(); + notify != NULL; notify = notify->getNextSibling()) + { + if (!notify->hasName("notify")) + { + continue; + } + + BOOL unique = FALSE; + notify->getAttributeBOOL("unique", unique); + + F32 duration = gSavedSettings.getF32("NotifyTipDuration"); + notify->getAttributeF32("duration", duration); + + LLPointer xml_template = new LLNotifyBoxTemplate(unique, duration); + + // label= + std::string notify_name; + if (notify->getAttributeString("name", notify_name)) + { + xml_template->mLabel = notify_name; + } + else + { + llwarns << "Unable to parse notify with no name" << llendl; + continue; + } + // modal= + BOOL tip; + if (notify->getAttributeBOOL("tip", tip)) + { + xml_template->mIsTip = tip; + } + + // parse a bool attribute named "caution" to determine + // whether this notification gets cautionary special handling + BOOL caution = FALSE; + if (notify->getAttributeBOOL("caution", caution)) + { + if (xml_template) + { + xml_template->mIsCaution = caution; + } + } + + + S32 btn_idx = 0; + for (LLXMLNode* child = notify->getFirstChild(); + child != NULL; child = child->getNextSibling()) + { + // + if (child->hasName("message")) + { + xml_template->mMessage = child->getTextContents(); + } + + //

    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 z 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 m^-EPgetVObj().notNull() && drawablep->getVObj()->isSelected()) @@ -2742,7 +2749,11 @@ void LLPipeline::renderForSelect(std::set& objects, BOOL render LLDrawable* drawable = vobj->mDrawable; if (vobj->isDead() || vobj->isHUDAttachment() || - (gHideSelectedObjects && vobj->isSelected()) || + (gHideSelectedObjects +//MK + && (!RRenabled || !gAgent.mRRInterface.mContainsEdit) +//mk + && vobj->isSelected()) || drawable->isDead() || !hasRenderType(drawable->getRenderType())) { diff --git a/linden/indra/newview/prefsrainbow.cpp b/linden/indra/newview/prefsrainbow.cpp index 72233a7..27e4635 100644 --- a/linden/indra/newview/prefsrainbow.cpp +++ b/linden/indra/newview/prefsrainbow.cpp @@ -50,16 +50,21 @@ class LLPrefsRainbowImpl : public LLPanel void apply(); void cancel(); -private: +protected: static void onCommitCheckBox(LLUICtrl* ctrl, void* user_data); - void refreshValues(); BOOL mShowGrids; BOOL mSaveScriptsAsMono; BOOL mDoubleClickTeleport; BOOL mHideNotificationsInChat; + BOOL mDisableMessagesSpacing; + BOOL mHideMasterRemote; + BOOL mShowGroupsButton; + BOOL mUseOldChatHistory; + BOOL mUseOldStatusBarIcons; BOOL mUseOldTrackingDots; BOOL mAllowMUpose; BOOL mAutoCloseOOC; + BOOL mPlayTypingSound; BOOL mPrivateLookAt; BOOL mFetchInventoryOnLogin; BOOL mRestrainedLife; @@ -73,26 +78,69 @@ LLPrefsRainbowImpl::LLPrefsRainbowImpl() : LLPanel("Rainbow Prefs Panel") { LLUICtrlFactory::getInstance()->buildPanel(this, "panel_preferences_rainbow.xml"); + childSetCommitCallback("restrained_life_check", onCommitCheckBox, this); refresh(); } -void LLPrefsRainbowImpl::refreshValues() +//static +void LLPrefsRainbowImpl::onCommitCheckBox(LLUICtrl* ctrl, void* user_data) +{ + LLPrefsRainbowImpl* self = (LLPrefsRainbowImpl*)user_data; + if (self->childGetValue("restrained_life_check").asBoolean()) + { + gSavedSettings.setBOOL("FetchInventoryOnLogin", TRUE); + self->childSetValue("fetch_inventory_on_login_check", TRUE); + self->childDisable("fetch_inventory_on_login_check"); + } + else + { + self->childEnable("fetch_inventory_on_login_check"); + } +} + +void LLPrefsRainbowImpl::refresh() { mShowGrids = gSavedSettings.getBOOL("ForceShowGrid"); mSaveScriptsAsMono = gSavedSettings.getBOOL("SaveScriptsAsMono"); - mDoubleClickTeleport = gSavedSettings.getBOOL("DoubleClickTeleport"); - mHideNotificationsInChat = gSavedSettings.getBOOL("HideNotificationsInChat"); + mDoubleClickTeleport = gSavedSettings.getBOOL("DoubleClickTeleport"); + mHideNotificationsInChat = gSavedSettings.getBOOL("HideNotificationsInChat"); + mDisableMessagesSpacing = gSavedSettings.getBOOL("DisableMessagesSpacing"); + mHideMasterRemote = gSavedSettings.getBOOL("HideMasterRemote"); + mShowGroupsButton = gSavedSettings.getBOOL("ShowGroupsButton"); + mUseOldChatHistory = gSavedSettings.getBOOL("UseOldChatHistory"); + mUseOldStatusBarIcons = gSavedSettings.getBOOL("UseOldStatusBarIcons"); mUseOldTrackingDots = gSavedSettings.getBOOL("UseOldTrackingDots"); mAllowMUpose = gSavedSettings.getBOOL("AllowMUpose"); mAutoCloseOOC = gSavedSettings.getBOOL("AutoCloseOOC"); + mPlayTypingSound = gSavedSettings.getBOOL("PlayTypingSound"); mPrivateLookAt = gSavedSettings.getBOOL("PrivateLookAt"); - mSecondsInChatAndIMs = gSavedSettings.getBOOL("SecondsInChatAndIMs"); - mFetchInventoryOnLogin = gSavedSettings.getBOOL("FetchInventoryOnLogin"); -} + mSecondsInChatAndIMs = gSavedSettings.getBOOL("SecondsInChatAndIMs"); + mRestrainedLife = gSavedSettings.getBOOL("RestrainedLife"); + if (mRestrainedLife) + { + mFetchInventoryOnLogin = TRUE; + gSavedSettings.setBOOL("FetchInventoryOnLogin", TRUE); + } + else + { + mFetchInventoryOnLogin = gSavedSettings.getBOOL("FetchInventoryOnLogin"); + } + + if (LLStartUp::getStartupState() != STATE_STARTED) + { + childDisable("restrained_life_check"); + } + + if (mRestrainedLife) + { + childSetValue("fetch_inventory_on_login_check", TRUE); + childDisable("fetch_inventory_on_login_check"); + } + else + { + childEnable("fetch_inventory_on_login_check"); + } -void LLPrefsRainbowImpl::refresh() -{ - refreshValues(); std::string format = gSavedSettings.getString("ShortTimeFormat"); if (format.find("%p") == -1) { @@ -134,14 +182,20 @@ void LLPrefsRainbowImpl::refresh() void LLPrefsRainbowImpl::cancel() { - gSavedSettings.setBOOL("ForceShowGrid", mShowGrids); - gSavedSettings.setBOOL("SaveScriptsAsMono", mSaveScriptsAsMono); + gSavedSettings.setBOOL("ForceShowGrid", mShowGrids); + gSavedSettings.setBOOL("SaveScriptsAsMono", mSaveScriptsAsMono); gSavedSettings.setBOOL("DoubleClickTeleport", mDoubleClickTeleport); gSavedSettings.setBOOL("HideNotificationsInChat", mHideNotificationsInChat); + gSavedSettings.setBOOL("DisableMessagesSpacing", mDisableMessagesSpacing); + gSavedSettings.setBOOL("HideMasterRemote", mHideMasterRemote); + gSavedSettings.setBOOL("ShowGroupsButton", mShowGroupsButton); + gSavedSettings.setBOOL("UseOldChatHistory", mUseOldChatHistory); + gSavedSettings.setBOOL("UseOldStatusBarIcons", mUseOldStatusBarIcons); gSavedSettings.setBOOL("UseOldTrackingDots", mUseOldTrackingDots); - gSavedSettings.setBOOL("AllowMUpose", mAllowMUpose); - gSavedSettings.setBOOL("AutoCloseOOC", mAutoCloseOOC); - gSavedSettings.setBOOL("PrivateLookAt", mPrivateLookAt); + gSavedSettings.setBOOL("AllowMUpose", mAllowMUpose); + gSavedSettings.setBOOL("AutoCloseOOC", mAutoCloseOOC); + gSavedSettings.setBOOL("PlayTypingSound", mPlayTypingSound); + gSavedSettings.setBOOL("PrivateLookAt", mPrivateLookAt); gSavedSettings.setBOOL("FetchInventoryOnLogin", mFetchInventoryOnLogin); gSavedSettings.setBOOL("RestrainedLife", mRestrainedLife); gSavedSettings.setBOOL("SecondsInChatAndIMs", mSecondsInChatAndIMs); @@ -199,8 +253,6 @@ void LLPrefsRainbowImpl::apply() gSavedSettings.setString("ShortTimeFormat", short_time); gSavedSettings.setString("LongTimeFormat", long_time); gSavedSettings.setString("TimestampFormat", timestamp); - - refreshValues(); } //--------------------------------------------------------------------------- diff --git a/linden/indra/newview/res/viewerRes.rc b/linden/indra/newview/res/viewerRes.rc index cc36e67..c38799e 100644 --- a/linden/indra/newview/res/viewerRes.rc +++ b/linden/indra/newview/res/viewerRes.rc @@ -248,13 +248,13 @@ BEGIN BLOCK "040904b0" BEGIN VALUE "CompanyName", "Boy Lane" - VALUE "FileDescription", "Rainbow Viewer" + VALUE "FileDescription", "Rainbow Viewer:Cool Edition" VALUE "FileVersion", "1.22.12.0" - VALUE "InternalName", "Rainbow Viewer" + VALUE "InternalName", "Rainbow Viewer::Cool Edition" VALUE "LegalCopyright", "GPL" - VALUE "OriginalFilename", "RainbowViewer.exe" - VALUE "ProductName", "Rainbow Viewer" - VALUE "ProductVersion", "1.22.12.0 R4" + VALUE "OriginalFilename", "CoolViewer.exe" + VALUE "ProductName", "Rainbow Viewer::Cool Edition" + VALUE "ProductVersion", "1.22.12.0 R11" END END BLOCK "VarFileInfo" diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_audio_volume.xml b/linden/indra/newview/skins/default/xui/en-us/floater_audio_volume.xml index 41dc3eb..bc806f3 100644 --- a/linden/indra/newview/skins/default/xui/en-us/floater_audio_volume.xml +++ b/linden/indra/newview/skins/default/xui/en-us/floater_audio_volume.xml @@ -1,8 +1,11 @@ - - + + diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml b/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml index 4be65b6..8878425 100644 --- a/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml +++ b/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml @@ -45,17 +45,15 @@ - + text_readonly_color="ChatHistoryTextColor" width="300" word_wrap="true" /> Gestures @@ -63,25 +61,64 @@ enabled="true" follows="left|right|bottom" font="SansSerif" handle_edit_keys_directly="false" height="20" label="Click here to chat." left="0" max_length="254" mouse_opaque="true" name="Chat Editor" - right="-70" select_all_on_focus_received="false" select_on_focus="false" + right="-110" select_all_on_focus_received="false" select_on_focus="false" tab_group="1" /> - - - Shout - - - Say - - - Whisper - - +