diff --git a/ChangeLog.txt b/ChangeLog.txt new file mode 100644 index 0000000..c86e9db --- /dev/null +++ b/ChangeLog.txt @@ -0,0 +1,206 @@ +2010-04-20 Boy Lane + + * Merged with changes from RV 1.22.12.6 + + modified: linden/indra/llcommon/imageids.h + modified: linden/indra/llcommon/llversionviewer.h + modified: linden/indra/llrender/llrender.cpp + modified: linden/indra/llrender/llrender.h + modified: linden/indra/llwindow/lldxhardware.cpp + modified: linden/indra/newview/English.lproj/InfoPlist.strings + modified: linden/indra/newview/Info-CoolViewer.plist + modified: linden/indra/newview/LICENSE.txt + modified: linden/indra/newview/RRInterface.h + modified: linden/indra/newview/Release_Notes.txt + modified: linden/indra/newview/app_settings/settings.xml + modified: linden/indra/newview/installers/windows/installer_template.nsi + modified: linden/indra/newview/llagent.cpp + modified: linden/indra/newview/llagent.h + modified: linden/indra/newview/llassetuploadresponders.cpp + modified: linden/indra/newview/lldrawpoolavatar.cpp + modified: linden/indra/newview/lldrawpoolavatar.h + modified: linden/indra/newview/llfloaterabout.cpp + modified: linden/indra/newview/llfloatercustomize.cpp + modified: linden/indra/newview/llfloatercustomize.h + modified: linden/indra/newview/llinventoryactions.cpp + modified: linden/indra/newview/llinventorybridge.cpp + modified: linden/indra/newview/llinventorybridge.h + modified: linden/indra/newview/llinventoryview.cpp + modified: linden/indra/newview/lltexlayer.cpp + modified: linden/indra/newview/lltexlayer.h + modified: linden/indra/newview/lltexturectrl.cpp + modified: linden/indra/newview/lltexturectrl.h + modified: linden/indra/newview/lltooldraganddrop.cpp + modified: linden/indra/newview/lltoolmorph.cpp + modified: linden/indra/newview/lltoolpie.cpp + modified: linden/indra/newview/lltoolplacer.cpp + modified: linden/indra/newview/llviewerdisplay.cpp + modified: linden/indra/newview/llviewermenu.cpp + modified: linden/indra/newview/llvoavatar.cpp + modified: linden/indra/newview/llvoavatar.h + modified: linden/indra/newview/llvovolume.cpp + modified: linden/indra/newview/llwearable.cpp + modified: linden/indra/newview/llwearable.h + modified: linden/indra/newview/pipeline.cpp + modified: linden/indra/newview/prefsrainbow.cpp + modified: linden/indra/newview/res/viewerRes.rc + modified: linden/indra/newview/skins/default/textures/textures.xml + modified: linden/indra/newview/skins/default/xui/en-us/floater_build_options.xml + modified: linden/indra/newview/skins/default/xui/en-us/floater_customize.xml + modified: linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml + modified: linden/indra/newview/skins/default/xui/en-us/floater_new_outfit_dialog.xml + modified: linden/indra/newview/skins/default/xui/en-us/menu_inventory.xml + modified: linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml + modified: linden/indra/newview/skins/default/xui/en-us/panel_login.xml + modified: linden/indra/newview/skins/default/xui/en-us/panel_preferences_rainbow.xml + + +2010-04-06 Boy Lane + + * Merged with changes from RV 1.22.12.5 + + modified: README.txt + modified: linden/indra/cmake/00-Common.cmake + modified: linden/indra/llcharacter/llcharacter.cpp + modified: linden/indra/llcharacter/llcharacter.h + modified: linden/indra/llcharacter/llkeyframemotion.cpp + modified: linden/indra/llcommon/llsecondlifeurls.cpp + modified: linden/indra/llcommon/llversionviewer.h + modified: linden/indra/llmath/llvolume.cpp + modified: linden/indra/llmath/llvolume.h + modified: linden/indra/llrender/llimagegl.cpp + modified: linden/indra/llrender/llimagegl.h + modified: linden/indra/llui/lltexteditor.h + modified: linden/indra/llui/lluictrlfactory.cpp + modified: linden/indra/newview/CMakeLists.txt + modified: linden/indra/newview/English.lproj/InfoPlist.strings + modified: linden/indra/newview/Info-CoolViewer.plist + new file: linden/indra/newview/LICENSE.txt + new file: linden/indra/newview/README_IMPORTANT!!!.txt + modified: linden/indra/newview/RRInterface.cpp + modified: linden/indra/newview/RRInterface.h + new file: linden/indra/newview/Release_Notes.txt + new file: linden/indra/newview/RestrainedLoveReadme.txt + modified: linden/indra/newview/app_settings/grids.xml + modified: linden/indra/newview/app_settings/settings.xml + new file: linden/indra/newview/emeraldboobutils.cpp + new file: linden/indra/newview/emeraldboobutils.h + modified: linden/indra/newview/gpu_table.txt + modified: linden/indra/newview/installers/windows/installer_template.nsi + modified: linden/indra/newview/llagent.cpp + modified: linden/indra/newview/llappviewer.cpp + modified: linden/indra/newview/llfilepicker.cpp + modified: linden/indra/newview/llfloaterabout.cpp + modified: linden/indra/newview/llfloateranimpreview.cpp + modified: linden/indra/newview/llfloateranimpreview.h + modified: linden/indra/newview/llfloatercustomize.cpp + modified: linden/indra/newview/llfloatercustomize.h + modified: linden/indra/newview/llfloaterimagepreview.cpp + new file: linden/indra/newview/llfloatersearchreplace.cpp + new file: linden/indra/newview/llfloatersearchreplace.h + modified: linden/indra/newview/llfolderview.cpp + modified: linden/indra/newview/llfolderview.h + modified: linden/indra/newview/llgivemoney.cpp + modified: linden/indra/newview/llhudeffectlookat.cpp + modified: linden/indra/newview/llinventoryactions.cpp + modified: linden/indra/newview/llinventorybridge.cpp + modified: linden/indra/newview/llinventorybridge.h + modified: linden/indra/newview/llinventorymodel.cpp + modified: linden/indra/newview/llinventoryview.cpp + modified: linden/indra/newview/llpanellogin.cpp + modified: linden/indra/newview/llpreview.cpp + modified: linden/indra/newview/llpreviewnotecard.cpp + modified: linden/indra/newview/llpreviewnotecard.h + modified: linden/indra/newview/llpreviewscript.cpp + modified: linden/indra/newview/llpreviewscript.h + modified: linden/indra/newview/llpreviewtexture.cpp + modified: linden/indra/newview/llspatialpartition.cpp + modified: linden/indra/newview/llstartup.cpp + modified: linden/indra/newview/lltoolbar.cpp + modified: linden/indra/newview/lltoolbar.h + modified: linden/indra/newview/llurlsimstring.cpp + modified: linden/indra/newview/llviewercontrol.cpp + modified: linden/indra/newview/llviewerdisplay.cpp + modified: linden/indra/newview/llviewerdisplay.h + modified: linden/indra/newview/llviewermenu.cpp + modified: linden/indra/newview/llviewermenufile.cpp + modified: linden/indra/newview/llviewermessage.cpp + modified: linden/indra/newview/llvoavatar.cpp + modified: linden/indra/newview/llvoavatar.h + modified: linden/indra/newview/llwearable.cpp + modified: linden/indra/newview/llwearable.h + modified: linden/indra/newview/prefsrainbow.cpp + modified: linden/indra/newview/res/viewerRes.rc + modified: linden/indra/newview/skins/default/xui/en-us/floater_animation_preview.xml + modified: linden/indra/newview/skins/default/xui/en-us/floater_camera.xml + modified: linden/indra/newview/skins/default/xui/en-us/floater_customize.xml + modified: linden/indra/newview/skins/default/xui/en-us/floater_image_preview.xml + modified: linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml + modified: linden/indra/newview/skins/default/xui/en-us/floater_new_outfit_dialog.xml + modified: linden/indra/newview/skins/default/xui/en-us/floater_pay.xml + modified: linden/indra/newview/skins/default/xui/en-us/floater_preview_notecard.xml + modified: linden/indra/newview/skins/default/xui/en-us/floater_preview_notecard_keep_discard.xml + new file: linden/indra/newview/skins/default/xui/en-us/floater_search_replace.xml + modified: linden/indra/newview/skins/default/xui/en-us/floater_tools.xml + modified: linden/indra/newview/skins/default/xui/en-us/menu_login.xml + modified: linden/indra/newview/skins/default/xui/en-us/panel_avatar.xml + modified: linden/indra/newview/skins/default/xui/en-us/panel_login.xml + modified: linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml + modified: linden/indra/newview/skins/default/xui/en-us/panel_preferences_graphics1.xml + modified: linden/indra/newview/skins/default/xui/en-us/panel_preferences_rainbow.xml + modified: linden/indra/newview/skins/default/xui/en-us/panel_toolbar.xml + modified: linden/indra/newview/skins/default/xui/en-us/panel_toolbar1.xml + modified: linden/indra/newview/skins/default/xui/en-us/panel_toolbar2.xml + modified: linden/indra/newview/skins/silver/xui/en-us/panel_avatar.xml + modified: linden/indra/newview/skins/silver/xui/en-us/panel_toolbar.xml + modified: linden/indra/newview/viewer_manifest.py + + +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..d612671 100644 --- a/README.txt +++ b/README.txt @@ -1,11 +1,7 @@ -RAINBOW MASTER 1.22.12.0 +COOL VIEWER 1.22.12 R12 -That's the current baseline for all Rainbow and Cool Viewers. +That's Cool Viewer 1.22.12 Release 12 final. 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..c034cee 100644 --- a/RELEASE_NOTES.txt +++ b/RELEASE_NOTES.txt @@ -1,7 +1,159 @@ -RAINBOW MASTER 1.22.12.0 +Release Notes for Rainbow Viewer::Cool Edition 1.22.12 Release 12, April 6 2010 +=============================================================================== +Rainbow Viewer is a speedy Metaverse Client that can connect you to a huge variety of exciting Virtual Worlds! -25 Dec 2009 -First public release of new 1.22.12.0 viewer baseline. -Full functionality included (or so I hope). No RLV. +You can find more information and downloads on the following websites: +http://my.opera.com/boylane (blog) +http://coolviewer.googlecode.com (installers) +http://github.com/boy (source code) + +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 apologize. + +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, especially the people involved and behind Imprudence! + +Details of included features: + +Patches by Aimee Trescothick: +* AmbiantMasterVolume: Fixes the issue with ambient 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 Aleric Inglewood +* InvisibleAvatars: Avatars completely invisible when first in sight, except for attachments; zooming in fixes it. (VWR-13996) +* LLimageTGA_DeleteColorMapFix: fixes a memory leak (VWR-10837). + +Patches by Armin Weatherwax +* ShowLookAtFix: Fixed a possible crash related to ShowLookAt targets + +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. +* AVShapeExportImport: Baed on Emerald, this patch allows the Export and Import of avatar shapes (creator only) +* CompilerOmitFramePointers: fix some default compiler optimizations. +* DisallowLindenHairRemoval: fix for RLV that prevents removal of hair/hairbase that leads to unrezzed AVs +* GPU_Table: adds a new GPU table of supported graphic cards from Snowglobe +* Incomplete OblongSculpties: backport from 1.23 that fixes incomplete rendering of some sculpties +* JigglyBewbz: Breast physics aka jiggly bewbz from Emerald. Complicated confguration left in debug settings. +* 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 Henri Beauchamp to the 1.22 viewer. Radar button in toolbar. +* 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. +* TemporaryTextureUpload: based on Emerald this allows the upload of textures without paying for testing purposes only +* Verified OpenSim grids: tested and updated list of grids to choose from on startup +* 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 flaky 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. +* GtkFilePickerFilterLoadXML: fixes a bug with the GTK file picker when trying to load a XML file (the *.xml filter was not set). +* 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. +* ImageGLPickMaskCrashFix patch: fixes a bug that sometimes crashes the viewer when touching (or caming on) an object which is being rezzed. +* 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 rezzing 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). +* SaveScriptsAsMono: Allows to save scripts in inventory as Mono scripts instead of LSL2 (when the SaveScriptsAsMono setting is set to TRUE). Fixes VWR-8827. +* SaveTextureAsFileExtension: fixes a problem with textures being saved without the proper .tga filename extension. +* SearchDescAndCreator: based on Emerald, this patch allows to search the inventory for matching words in item names (default and normal behaviour) and/or item description and/or item creator. +* SpeedRez_v2: "speeds up" rezzing (actually rez closer objects first) on login and teleports, by temporarily reducing the draw distance to 32m and stepping it back up to its original value at a regular interval of time after login/TP. This feature is enabled when the SpeedRez variable is set to TRUE, and the interval may be adjusted via the SpeedRezInterval variable (defaults to 12s). +* TeleportHistory_RestrainedLife_addon: addon patch for usage restrictions of TeleportHistory with RestrainedLife active. +* UnknownJointsCrashFix: fixes some crashes that can occur when encountering avatars wearing objects on unofficial attachment points. + +Patches by Jacek Antonelli +* LocalRulerAlignment: Fixes a problem with the edit tools in "Local" ruler mode (VWR-1852). +* PaymentMessage: Optional text for payments to show up in transaction history + +Patches by Kitty Barnett: +* BuildFloaterMouseLookQuirk: Fixes a quirk with mouse-look in build mode (VWR-14767). +* NotecardScriptSearchReplace: adds a search/replace feature. +* PanelLoginFocusedGridSelectionCrash: fixes a crash bug when quitting the viewer while the grid selection combo is selected (VWR-14765). + +Patches by KOW +* DisabledViewerStats: Disables sending of viewer statistics to LL + +Patches by Marine Kelley: +* RestrainedLove_v1.23 with improvements by Henri Beauchamp + +Patches by Mm Alder: +* LoadXUIfromXML: Fixes a bug in the Advanced/XUI/Load from XML feature (VWR-14475). + +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 friendship 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). +* OblongSculptiesDetails: this patch increases the level of details (LOD) for oblong sculpties (sculpties using a sculpt texture with different width and height) when necessary. +* 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). +* 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. +* 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). +* MakeOutfitButtons: check/uncheck all buttons for make outfit from Meerkat viewer +* 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. +* PreviewAnimInWorld: from Emerald, this patch allows to preview animations on your own avatar prior to uploading. +* 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..ff37a9e 100644 --- a/linden/indra/cmake/00-Common.cmake +++ b/linden/indra/cmake/00-Common.cmake @@ -32,7 +32,7 @@ if (WINDOWS) "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MT" CACHE STRING "C++ compiler release-with-debug options" FORCE) set(CMAKE_CXX_FLAGS_RELEASE - "${CMAKE_CXX_FLAGS_RELEASE} ${LL_CXX_FLAGS} /O2 /Oi /Ob2 /Ot /Oy /MT /arch:SSE2" + "${CMAKE_CXX_FLAGS_RELEASE} ${LL_CXX_FLAGS} /O2 /Oi /Ob2 /Ot /Oy /MT /arch:SSE2 /GF /fp:fast" CACHE STRING "C++ compiler release options" FORCE) add_definitions( @@ -59,7 +59,7 @@ if (WINDOWS) # Are we using the crummy Visual Studio KDU build workaround? if (NOT VS_DISABLE_FATAL_WARNINGS) - add_definitions(/WX) + #add_definitions(/WX) endif (NOT VS_DISABLE_FATAL_WARNINGS) endif (WINDOWS) @@ -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/llcharacter/llcharacter.cpp b/linden/indra/llcharacter/llcharacter.cpp index 04d05e6..5d1980c 100644 --- a/linden/indra/llcharacter/llcharacter.cpp +++ b/linden/indra/llcharacter/llcharacter.cpp @@ -54,7 +54,8 @@ LLCharacter::LLCharacter() mPreferredPelvisHeight( 0.f ), mSex( SEX_FEMALE ), mAppearanceSerialNum( 0 ), - mSkeletonSerialNum( 0 ) + mSkeletonSerialNum( 0 ), + mInAppearance( false ) { mMotionController.setCharacter( this ); sInstances.push_back(this); diff --git a/linden/indra/llcharacter/llcharacter.h b/linden/indra/llcharacter/llcharacter.h index 8f1f7fb..8f23129 100644 --- a/linden/indra/llcharacter/llcharacter.h +++ b/linden/indra/llcharacter/llcharacter.h @@ -252,6 +252,11 @@ class LLCharacter ESex getSex() { return mSex; } void setSex( ESex sex ) { mSex = sex; } + // set appearance flag + void setAppearanceFlag( bool flag ) { mInAppearance = flag; } + bool getAppearanceFlag() { return mInAppearance; } + + U32 getAppearanceSerialNum() const { return mAppearanceSerialNum; } void setAppearanceSerialNum( U32 num ) { mAppearanceSerialNum = num; } @@ -272,6 +277,8 @@ class LLCharacter U32 mSkeletonSerialNum; LLAnimPauseRequest mPauseRequest; + BOOL mInAppearance; + private: // visual parameter stuff diff --git a/linden/indra/llcharacter/llkeyframemotion.cpp b/linden/indra/llcharacter/llkeyframemotion.cpp index 212020b..2b68cc4 100644 --- a/linden/indra/llcharacter/llkeyframemotion.cpp +++ b/linden/indra/llcharacter/llkeyframemotion.cpp @@ -1158,9 +1158,12 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8 { LLVector3 delta = source_to_target * weight; LLPointer current_joint_state = getJointState(shared_data->mJointStateIndices[0]); - LLQuaternion parent_rot = current_joint_state->getJoint()->getParent()->getWorldRotation(); - delta = delta * ~parent_rot; - current_joint_state->setPosition(current_joint_state->getJoint()->getPosition() + delta); + if (current_joint_state->getJoint()) + { + LLQuaternion parent_rot = current_joint_state->getJoint()->getParent()->getWorldRotation(); + delta = delta * ~parent_rot; + current_joint_state->setPosition(current_joint_state->getJoint()->getPosition() + delta); + } } } diff --git a/linden/indra/llcommon/imageids.h b/linden/indra/llcommon/imageids.h index 73ab1b8..513841d 100644 --- a/linden/indra/llcommon/imageids.h +++ b/linden/indra/llcommon/imageids.h @@ -43,6 +43,7 @@ // pre-cached on viewer // Grass Images +const LLUUID IMG_CLEAR ("11ee27f5-43c0-414e-afd5-d7f5688c351f"); // VIEWER const LLUUID IMG_SMOKE ("b4ba225c-373f-446d-9f7e-6cb7b5cf9b3d"); // VIEWER const LLUUID IMG_DEFAULT ("d2114404-dd59-4a4d-8e6c-49359e91bbf0"); // VIEWER @@ -55,6 +56,7 @@ const LLUUID IMG_SPARK ("d2e75ac1-d0fb-4532-820e-a20034ac814d"); // dataserver const LLUUID IMG_FIRE ("aca40aa8-44cf-44ca-a0fa-93e1a2986f82"); // dataserver const LLUUID IMG_FACE_SELECT ("a85ac674-cb75-4af6-9499-df7c5aaf7a28"); // face selector const LLUUID IMG_DEFAULT_AVATAR ("c228d1cf-4b5d-4ba8-84f4-899a0796aa97"); // dataserver +const LLUUID IMG_INVISIBLE ("3a367d1c-bef1-6d43-7595-e88c1e3aadb3"); // dataserver const LLUUID IMG_EXPLOSION ("68edcf47-ccd7-45b8-9f90-1649d7f12806"); // On dataserver const LLUUID IMG_EXPLOSION_2 ("21ce046c-83fe-430a-b629-c7660ac78d7c"); // On dataserver diff --git a/linden/indra/llcommon/llsecondlifeurls.cpp b/linden/indra/llcommon/llsecondlifeurls.cpp index f1ce653..bc177f0 100644 --- a/linden/indra/llcommon/llsecondlifeurls.cpp +++ b/linden/indra/llcommon/llsecondlifeurls.cpp @@ -84,4 +84,4 @@ const std::string SL_KB_URL ( "http://secondlife.com/knowledgebase/"); const std::string RELEASE_NOTES_BASE_URL ( - "http://secondlife.com/app/releasenotes/"); + "http://code.google.com/p/coolviewer/wiki/ReleaseNotes"); diff --git a/linden/indra/llcommon/llversionviewer.h b/linden/indra/llcommon/llversionviewer.h index 9069a58..2b6d8b3 100644 --- a/linden/indra/llcommon/llversionviewer.h +++ b/linden/indra/llcommon/llversionviewer.h @@ -35,7 +35,7 @@ const S32 LL_VERSION_MAJOR = 1; const S32 LL_VERSION_MINOR = 22; const S32 LL_VERSION_PATCH = 12; -const S32 LL_VERSION_BUILD = 0; +const S32 LL_VERSION_BUILD = 13; const char * const LL_CHANNEL = "Rainbow Viewer"; diff --git a/linden/indra/llmath/llvolume.cpp b/linden/indra/llmath/llvolume.cpp index ce11b08..cb2e988 100644 --- a/linden/indra/llmath/llvolume.cpp +++ b/linden/indra/llmath/llvolume.cpp @@ -16,7 +16,8 @@ * 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 + * 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, @@ -1972,34 +1973,29 @@ inline LLVector3 sculpt_xy_to_vector(U32 x, U32 y, U16 sculpt_width, U16 sculpt_ } -F32 LLVolume::sculptGetSurfaceArea(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data) +F32 LLVolume::sculptGetSurfaceArea() { // test to see if image has enough variation to create non-degenerate geometry + F32 area = 0; + S32 sizeS = mPathp->mPath.size(); S32 sizeT = mProfilep->mProfile.size(); - - F32 area = 0; - - if ((sculpt_width != 0) && - (sculpt_height != 0) && - (sculpt_components != 0) && - (sculpt_data != NULL)) + + for (S32 s = 0; s < sizeS-1; s++) { - for (S32 s = 0; s < sizeS - 1; s++) + for (S32 t = 0; t < sizeT-1; t++) { - for (S32 t = 0; t < sizeT - 1; t++) - { - // convert image data to vectors - LLVector3 p1 = sculpt_st_to_vector(s, t, sizeS, sizeT, sculpt_width, sculpt_height, sculpt_components, sculpt_data); - LLVector3 p2 = sculpt_st_to_vector(s+1, t, sizeS, sizeT, sculpt_width, sculpt_height, sculpt_components, sculpt_data); - LLVector3 p3 = sculpt_st_to_vector(s, t+1, sizeS, sizeT, sculpt_width, sculpt_height, sculpt_components, sculpt_data); - - // compute the area of the parallelogram by taking the length of the cross product: - // (parallegram is an approximation of two triangles) - LLVector3 cross = (p1 - p2) % (p1 - p3); - area += cross.magVec(); - } + // get four corners of quad + LLVector3 p1 = mMesh[(s )*sizeT + (t )].mPos; + LLVector3 p2 = mMesh[(s+1)*sizeT + (t )].mPos; + LLVector3 p3 = mMesh[(s )*sizeT + (t+1)].mPos; + LLVector3 p4 = mMesh[(s+1)*sizeT + (t+1)].mPos; + + // compute the area of the quad by taking the length of the cross product of the two triangles + LLVector3 cross1 = (p1 - p2) % (p1 - p3); + LLVector3 cross2 = (p4 - p2) % (p4 - p3); + area += (cross1.magVec() + cross2.magVec()) / 2.0; } } @@ -2205,7 +2201,21 @@ S32 sculpt_sides(F32 detail) // determine the number of vertices in both s and t direction for this sculpt void sculpt_calc_mesh_resolution(U16 width, U16 height, U8 type, F32 detail, S32& s, S32& t) { - S32 vertices = sculpt_sides(detail); + // this code has the following properties: + // 1) the aspect ratio of the mesh is as close as possible to the ratio of the map + // while still using all available verts + // 2) the mesh cannot have more verts than is allowed by LOD + // 3) the mesh cannot have more verts than is allowed by the map + + S32 max_vertices_lod = (S32)pow((double)sculpt_sides(detail), 2.0); + S32 max_vertices_map = width * height / 4; + + S32 vertices; + if (max_vertices_map > 0) + vertices = llmin(max_vertices_lod, max_vertices_map); + else + vertices = max_vertices_lod; + F32 ratio; if ((width == 0) || (height == 0)) @@ -2214,13 +2224,13 @@ void sculpt_calc_mesh_resolution(U16 width, U16 height, U8 type, F32 detail, S32 ratio = (F32) width / (F32) height; - s = (S32)(vertices / fsqrtf(ratio)); + s = (S32)fsqrtf(((F32)vertices / ratio)); - s = llmax(s, 3); // no degenerate sizes, please - t = vertices * vertices / s; + s = llmax(s, 4); // no degenerate sizes, please + t = vertices / s; - t = llmax(t, 3); // no degenerate sizes, please - s = vertices * vertices / t; + t = llmax(t, 4); // no degenerate sizes, please + s = vertices / t; } // sculpt replaces generate() for sculpted surfaces @@ -2269,20 +2279,25 @@ void LLVolume::sculpt(U16 sculpt_width, sNumMeshPoints -= mMesh.size(); mMesh.resize(sizeS * sizeT); sNumMeshPoints += mMesh.size(); - - if (!data_is_empty && sculptGetSurfaceArea(sculpt_width, sculpt_height, sculpt_components, sculpt_data) < SCULPT_MIN_AREA) - data_is_empty = TRUE; //generate vertex positions - if (data_is_empty) // if empty, make a placeholder mesh - { - sculptGeneratePlaceholder(); - } - else + if (!data_is_empty) { sculptGenerateMapVertices(sculpt_width, sculpt_height, sculpt_components, sculpt_data, sculpt_type, is_flexible); + + if (sculptGetSurfaceArea() < SCULPT_MIN_AREA) + { + data_is_empty = TRUE; + } } + if (data_is_empty) + { + sculptGeneratePlaceholder(); + } + + + for (S32 i = 0; i < (S32)mProfilep->mFaces.size(); i++) { mFaceMask |= mProfilep->mFaces[i].mFaceID; diff --git a/linden/indra/llmath/llvolume.h b/linden/indra/llmath/llvolume.h index c2aad5c..6c946aa 100644 --- a/linden/indra/llmath/llvolume.h +++ b/linden/indra/llmath/llvolume.h @@ -942,8 +942,8 @@ class LLVolume : public LLRefCount void sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, S32 sculpt_level, BOOL is_flexible); private: - F32 sculptGetSurfaceArea(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data); void sculptGenerateMapVertices(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, U8 sculpt_type, BOOL is_flexible); + F32 sculptGetSurfaceArea(); void sculptGeneratePlaceholder(); void sculptCalcMeshResolution(U16 width, U16 height, U8 type, S32& s, S32& t); 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/llrender/llimagegl.cpp b/linden/indra/llrender/llimagegl.cpp index 6a142a7..a32b7b5 100644 --- a/linden/indra/llrender/llimagegl.cpp +++ b/linden/indra/llrender/llimagegl.cpp @@ -298,6 +298,7 @@ LLImageGL::~LLImageGL() sImageList.erase(this); delete [] mPickMask; mPickMask = NULL; + mPickMaskSize = 0; sCount--; } @@ -308,6 +309,7 @@ void LLImageGL::init(BOOL usemipmaps) #endif mPickMask = NULL; + mPickMaskSize = 0; mTextureMemory = 0; mLastBindTime = 0.f; @@ -1364,20 +1366,21 @@ void LLImageGL::updatePickMask(S32 width, S32 height, const U8* data_in) //cannot generate a pick mask for this texture delete [] mPickMask; mPickMask = NULL; + mPickMaskSize = 0; return; } U32 pick_width = width/2; U32 pick_height = height/2; - U32 size = llmax(pick_width, (U32) 1) * llmax(pick_height, (U32) 1); + mPickMaskSize = llmax(pick_width, (U32) 1) * llmax(pick_height, (U32) 1); - size = size/8 + 1; + mPickMaskSize = mPickMaskSize/8 + 1; delete[] mPickMask; - mPickMask = new U8[size]; + mPickMask = new U8[mPickMaskSize]; - memset(mPickMask, 0, sizeof(U8) * size); + memset(mPickMask, 0, sizeof(U8) * mPickMaskSize); U32 pick_bit = 0; @@ -1391,7 +1394,7 @@ void LLImageGL::updatePickMask(S32 width, S32 height, const U8* data_in) { U32 pick_idx = pick_bit/8; U32 pick_offset = pick_bit%8; - if (pick_idx >= size) + if (pick_idx >= mPickMaskSize) { llerrs << "WTF?" << llendl; } @@ -1428,7 +1431,15 @@ BOOL LLImageGL::getMask(const LLVector2 &tc) S32 idx = y*width+x; S32 offset = idx%8; - res = mPickMask[idx/8] & (1 << offset) ? TRUE : FALSE; + if (idx / 8 < (S32)mPickMaskSize) + { + res = mPickMask[idx/8] & (1 << offset) ? TRUE : FALSE; + } + else + { + llwarns << "Index out of range for mPickMask !" << llendl; + return FALSE; + } } return res; diff --git a/linden/indra/llrender/llimagegl.h b/linden/indra/llrender/llimagegl.h index 1965495..3d4cc04 100644 --- a/linden/indra/llrender/llimagegl.h +++ b/linden/indra/llrender/llimagegl.h @@ -164,6 +164,7 @@ class LLImageGL : public LLRefCount private: LLPointer mSaveData; // used for destroyGL/restoreGL U8* mPickMask; //downsampled bitmap approximation of alpha channel. NULL if no alpha channel + U32 mPickMaskSize; S8 mUseMipMaps; S8 mHasMipMaps; S8 mHasExplicitFormat; // If false (default), GL format is f(mComponents) diff --git a/linden/indra/llrender/llrender.cpp b/linden/indra/llrender/llrender.cpp index ff0a2db..7de6919 100644 --- a/linden/indra/llrender/llrender.cpp +++ b/linden/indra/llrender/llrender.cpp @@ -707,6 +707,9 @@ void LLRender::setSceneBlendType(eBlendType type) case BT_MULT: glBlendFunc(GL_DST_COLOR, GL_ZERO); break; + case BT_MULT_ALPHA: + glBlendFunc(GL_DST_ALPHA, GL_ZERO); + break; case BT_MULT_X2: glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR); break; diff --git a/linden/indra/llrender/llrender.h b/linden/indra/llrender/llrender.h index e949190..4e2e985 100644 --- a/linden/indra/llrender/llrender.h +++ b/linden/indra/llrender/llrender.h @@ -223,6 +223,7 @@ class LLRender BT_ADD, BT_ADD_WITH_ALPHA, // Additive blend modulated by the fragment's alpha. BT_MULT, + BT_MULT_ALPHA, BT_MULT_X2, BT_REPLACE } eBlendType; diff --git a/linden/indra/llui/lltexteditor.h b/linden/indra/llui/lltexteditor.h index 61341e2..dfddec8 100644 --- a/linden/indra/llui/lltexteditor.h +++ b/linden/indra/llui/lltexteditor.h @@ -159,6 +159,7 @@ class LLTextEditor : public LLUICtrl, LLEditMenuHandler, protected LLPreeditor void setCursor(S32 row, S32 column); void setCursorPos(S32 offset); void setCursorAndScrollToEnd(); + void scrollToPos(S32 pos); void getLineAndColumnForPosition( S32 position, S32* line, S32* col, BOOL include_wordwrap ); void getCurrentLineAndColumn( S32* line, S32* col, BOOL include_wordwrap ); @@ -251,6 +252,8 @@ class LLTextEditor : public LLUICtrl, LLEditMenuHandler, protected LLPreeditor static bool isPartOfWord(llwchar c) { return (c == '_') || LLStringOps::isAlnum((char)c); } + BOOL isReadOnly() { return mReadOnly; } + protected: // // Methods diff --git a/linden/indra/llui/lluictrlfactory.cpp b/linden/indra/llui/lluictrlfactory.cpp index 07de717..373116e 100644 --- a/linden/indra/llui/lluictrlfactory.cpp +++ b/linden/indra/llui/lluictrlfactory.cpp @@ -157,21 +157,25 @@ bool LLUICtrlFactory::getLayeredXMLNode(const std::string &xui_filename, LLXMLNo { std::string full_filename = gDirUtilp->findSkinnedFilename(sXUIPaths.front(), xui_filename); if (full_filename.empty()) - { - llwarns << "Couldn't find UI description file: " << sXUIPaths.front() + gDirUtilp->getDirDelimiter() + xui_filename << llendl; - return false; - } - - if (!LLXMLNode::parseFile(full_filename, root, NULL)) { // try filename as passed in since sometimes we load an xml file from a user-supplied path - if (!LLXMLNode::parseFile(xui_filename, root, NULL)) + if (gDirUtilp->fileExists(xui_filename)) { - llwarns << "Problem reading UI description file: " << xui_filename << llendl; + full_filename = xui_filename; + } + else + { + llwarns << "Couldn't find UI description file: " << sXUIPaths.front() + gDirUtilp->getDirDelimiter() + xui_filename << llendl; return false; } } + if (!LLXMLNode::parseFile(full_filename, root, NULL)) + { + llwarns << "Problem reading UI description file: " << full_filename << llendl; + return false; + } + LLXMLNodePtr updateRoot; std::vector::const_iterator itor; 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/llwindow/lldxhardware.cpp b/linden/indra/llwindow/lldxhardware.cpp index deb7901..3dd4369 100644 --- a/linden/indra/llwindow/lldxhardware.cpp +++ b/linden/indra/llwindow/lldxhardware.cpp @@ -623,7 +623,37 @@ LLSD LLDXHardware::getDisplayInfo() ret["DeviceName"] = device_name; std::string device_driver= get_string(device_containerp, L"szDriverVersion"); ret["DriverVersion"] = device_driver; - } + + // ATI has a slightly different version string + if(device_name.length() >= 4 && device_name.substr(0,4) == "ATI ") + { + // get the key + HKEY hKey; + const DWORD RV_SIZE = 100; + WCHAR release_version[RV_SIZE]; + + // Hard coded registry entry. Using this since it's simpler for now. + // And using EnumDisplayDevices to get a registry key also requires + // a hard coded Query value. + if(ERROR_SUCCESS == RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\ATI Technologies\\CBT"), &hKey)) + { + // get the value + DWORD dwType = REG_SZ; + DWORD dwSize = sizeof(WCHAR) * RV_SIZE; + if(ERROR_SUCCESS == RegQueryValueEx(hKey, TEXT("ReleaseVersion"), + NULL, &dwType, (LPBYTE)release_version, &dwSize)) + { + // print the value + // windows doesn't guarantee to be null terminated + release_version[RV_SIZE - 1] = NULL; + ret["DriverVersion"] = utf16str_to_utf8str(release_version); + + } + RegCloseKey(hKey); + } + } + } + LCleanup: SAFE_RELEASE(file_containerp); SAFE_RELEASE(driver_containerp); diff --git a/linden/indra/newview/CMakeLists.txt b/linden/indra/newview/CMakeLists.txt index b085a9c..89ad100 100644 --- a/linden/indra/newview/CMakeLists.txt +++ b/linden/indra/newview/CMakeLists.txt @@ -61,6 +61,7 @@ include_directories( ) set(viewer_SOURCE_FILES + emeraldboobutils.cpp llagent.cpp llagentaccess.cpp llagentdata.cpp @@ -178,6 +179,7 @@ set(viewer_SOURCE_FILES llfloaterproperties.cpp llfloaterregioninfo.cpp llfloaterreporter.cpp + llfloatersearchreplace.cpp llfloaterscriptdebug.cpp llfloatersellland.cpp llfloatersettingsdebug.cpp @@ -437,9 +439,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) @@ -459,7 +462,7 @@ endif (LINUX) set(viewer_HEADER_FILES CMakeLists.txt ViewerInstall.cmake - + emeraldboobutils.h llagent.h llagentaccess.h llagentdata.h @@ -579,6 +582,7 @@ set(viewer_HEADER_FILES llfloaterproperties.h llfloaterregioninfo.h llfloaterreporter.h + llfloatersearchreplace.h llfloaterscriptdebug.h llfloatersellland.h llfloatersettingsdebug.h @@ -846,6 +850,7 @@ set(viewer_HEADER_FILES randgauss.h VertexCache.h VorbisFramework.h + RRInterface.h ) source_group("CMake Rules" FILES ViewerInstall.cmake) @@ -869,8 +874,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 @@ -1116,7 +1121,7 @@ set(viewer_XUI_FILES skins/default/xui/en-us/floater_script_ed_panel.xml skins/default/xui/en-us/floater_script_preview.xml skins/default/xui/en-us/floater_script_queue.xml - skins/default/xui/en-us/floater_script_search.xml + skins/default/xui/en-us/floater_search_replace.xml skins/default/xui/en-us/floater_select_key.xml skins/default/xui/en-us/floater_sell_land.xml skins/default/xui/en-us/floater_settings_debug.xml @@ -1443,13 +1448,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 +1471,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 +1481,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..ca4d383 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 R13"; +CFBundleGetInfoString = "Rainbow Viewer::Cool Edition version 1.22.12 R13, GPL, Boy Lane"; diff --git a/linden/indra/newview/Info-RainbowViewer.plist b/linden/indra/newview/Info-CoolViewer.plist similarity index 91% rename from linden/indra/newview/Info-RainbowViewer.plist rename to linden/indra/newview/Info-CoolViewer.plist index e6a3979..bfd6217 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 @@ -32,7 +32,7 @@ CFBundleVersion - 1.22.12.0 + 1.22.12.13 CSResourcesFileMapped 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/LICENSE.txt b/linden/indra/newview/LICENSE.txt new file mode 100644 index 0000000..97e176e --- /dev/null +++ b/linden/indra/newview/LICENSE.txt @@ -0,0 +1,48 @@ +Welcome to the Installation of Rainbow Viewer::Cool Edition, a speedy +Metaverse Client that can connect you to a huge variety of exciting Virtual Worlds! + +You can find more information and downloads on the following websites: +Blog: http://my.opera.com/boylane +Binaries: http://coolviewer.googlecode.com +Sources: http://github.com/boy + +This software is provided 'as-is' under the terms and protection of GPL2 +licensing, without any express or implied warranty. The user in downloading, +installing, using, modifying or distributing this product, assumes all liability +for their actions and holds harmless the creators/distributors of this product +for damages real or imagined, intentional, unintentional or negligent. In no +event will the author(s) be held liable for any consequences arising from the +development, use or distribution of this software. This product does not fall +under the laws of merchantability of any state, province or government. + +By using Rainbow Viewer::Cool Edition, you agree and are subject to the Terms +of Service (ToS) and Policies of the Grids to which you connect to. If you +intend to use this software to connect to Linden Lab's SecondLife service the +following additional conditions and disclosures apply: + +1) This software "Rainbow Viewer::Cool Edition 1.22.12 R13" ("Cool Viewer") is + not provided, supported or approved by Linden Lab. +2) Limited customer support in best effort only is available at the developers + website http://my.opera.com/boylane +3) No surprising or unexpected content or functionality other than listed in the + Release Notes is included. +4) Rainbow Viewer::Cool Edition does not collect, store, distribute or make any + other use of private user details. The exemption are the local storage of + your user name and password for automatic login as well as the local storage + of chat and IM logs as in Linden Lab's official client. + +This software is provided before an eventual commencement and without +acceptance of Linden Lab's Third Party Viewer Policy (TPV). Before using +Rainbow Viewer at YOUR OWN FULL RISK please make sure you also read +and understand TPV and its implications: +http://secondlife.com/corporate/tpv.php + +If you disagree with LL's TPV Policy, voice your opinion directly to Linden Lab +to support the ongoing development of 3rd Party Viewers! + +For reference, these terms can be found in LICENSE.txt in your CoolViewer +folder together with the accompanying Release_Notes.txt. Please also have a +look at README_IMPORTANT!!!.txt in the same place for further information +on performance optimization. + +Boy Lane, 19 April 2010 diff --git a/linden/indra/newview/README_IMPORTANT!!!.txt b/linden/indra/newview/README_IMPORTANT!!!.txt new file mode 100644 index 0000000..7f881f6 --- /dev/null +++ b/linden/indra/newview/README_IMPORTANT!!!.txt @@ -0,0 +1,37 @@ +INSTALLATION +============ + +This installer puts your new Rainbow Viewer::Cool Edition into +C:\Program Files\CoolViewer and it should not mess up any existing SecondLife, +Rainbow Viewer, Cool Viewer or other third party viewer installations. The +following Application Data location is used for settings, logs and caching +(in case of problems you may want to delete this folder manually to reset your +viewer to the default settings): + +WinXP: C:\Documents and Settings\\Application Data\RainbowViewer\ +Vista: C:\Users\\Appdata\Roaming\RainbowViewer\ + +Please start the Rainbow Viewer::Cool Edition always with the included +Cool Viewer.lnk shortcut only! + +For updates/latest version check out my blog: +http://my.opera.com/boylane + +Boy Lane + + +IMPORTANT!!! +============ +Please note that the following libraries and components are not included in the +package as they are not redistributable. The installer will try to automatically +pull them out of an existing installation of a SecondLife, Rainbow Viewer or +Cool Viewer on your machine. Please follow the prompt on the screen. Should it +not work please copy them from an official Linden Labs SL 1.22.11 viewer into +your C:\Program Files\RainbowViewer directory to get full functionality : + +llkdu.dll Kakadu JPEG2000 library +SLVoice.exe Voice components +vivoxsdk.dll + +The viewer will still run without them but with lower performance (OpenJPEG) and +missing voice features. \ No newline at end of file diff --git a/linden/indra/newview/RRInterface.cpp b/linden/indra/newview/RRInterface.cpp new file mode 100644 index 0000000..de64bcb --- /dev/null +++ b/linden/indra/newview/RRInterface.cpp @@ -0,0 +1,2632 @@ +/** +* @file RRInterface.cpp +* @author Marine Kelley +* @brief Implementation of the RLV features +* +* RLV Source Code +* The source code in this file ("Source Code") is provided by Marine Kelley +* 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 Marine Kelley. Terms of +* the GPL can be found in doc/GPL-license.txt in the distribution of the +* original source of the Second Life Viewer, or online at +* http://secondlifegrid.net/programs/open_source/licensing/gplv2 +* +* 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 SOURCE CODE FROM MARINE KELLEY IS PROVIDED "AS IS." MARINE KELLEY +* MAKES NO WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING +* ITS ACCURACY, COMPLETENESS OR PERFORMANCE. +*/ + +#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 +} + +std::string RRInterface::getVersion2 () +{ + return RR_VIEWER_NAME_NEW" 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("RestrainedLoveDebug") && 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("RestrainedLoveDebug")) { + 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("RestrainedLoveDebug"); + 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("RestrainedLoveDebug"); + 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("RestrainedLoveDebug"); + 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("RestrainedLoveDebug"); + // 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=="versionnew") return answerOnChat (param, getVersion2 ()); + 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("RestrainedLoveDebug")) { + 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("RestrainedLoveDebug"); + 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 only, not hair, skin, eyes, or shape + if (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) +{ + S32 chan = (S32)atoi(channel.c_str()); + if (chan == 0) { + // protection against abusive "@getstatus=0" commands, or against a non-numerical channel + return FALSE; + } + if (msg.length() > (size_t)(chan > 0 ? 1023 : 255)) { + llwarns << "Too large an answer: maximum is " << (chan > 0 ? "1023 characters" : "255 characters for a negative channel") << ". Aborted command." << llendl; + return FALSE; + } + if (chan > 0) { + std::ostringstream temp; + temp << "/" << chan << " " << msg; + gChatBar->sendChatFromViewer(temp.str(), CHAT_TYPE_SHOUT, FALSE); + } else { + gMessageSystem->newMessage("ScriptDialogReply"); + gMessageSystem->nextBlock("AgentData"); + gMessageSystem->addUUID("AgentID", gAgent.getID()); + gMessageSystem->addUUID("SessionID", gAgent.getSessionID()); + gMessageSystem->nextBlock("Data"); + gMessageSystem->addUUID("ObjectID", gAgent.getID()); + gMessageSystem->addS32("ChatChannel", chan); + gMessageSystem->addS32("ButtonIndex", 1); + gMessageSystem->addString("ButtonLabel", msg); + gAgent.sendReliableMessage(); + } + if (gSavedSettings.getBOOL("RestrainedLoveDebug")) { + llinfos << "/" << chan << " " << 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("RestrainedLoveDebug"); + 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("RestrainedLoveDebug"); + 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("RestrainedLoveDebug"); + 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("RestrainedLoveDebug"); + 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("RestrainedLoveDebug")) { + 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("RestrainedLoveDebug"); + // 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("RestrainedLoveDebug"); + // 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("RestrainedLoveDebug"); + // 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("RestrainedLoveDebug"); + // 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..f5a524d --- /dev/null +++ b/linden/indra/newview/RRInterface.h @@ -0,0 +1,227 @@ +/** + * @file RRInterface.h + * @author Marine Kelley + * @brief The header for all RLV features + * + * RLV Source Code + * The source code in this file ("Source Code") is provided by Marine Kelley + * 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 Marine Kelley. Terms of + * the GPL can be found in doc/GPL-license.txt in the distribution of the + * original source of the Second Life Viewer, or online at + * http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * 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 SOURCE CODE FROM MARINE KELLEY IS PROVIDED "AS IS." MARINE KELLEY + * MAKES NO WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING + * ITS ACCURACY, COMPLETENESS OR PERFORMANCE. + */ + +#ifndef LL_RRINTERFACE_H +#define LL_RRINTERFACE_H + +#define RR_VIEWER_NAME "RestrainedLife" +#define RR_VIEWER_NAME_NEW "RestrainedLove" +#define RR_VERSION_NUM "1230000" +#define RR_VERSION "1.23.0" +#define RR_SLV_VERSION "CV 1.22.12.13" + +#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 (); // returns "RestrainedLife Viewer blah blah" + std::string getVersion2 (); // returns "RestrainedLove Viewer blah blah" + 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/Release_Notes.txt b/linden/indra/newview/Release_Notes.txt new file mode 100644 index 0000000..be9ba8d --- /dev/null +++ b/linden/indra/newview/Release_Notes.txt @@ -0,0 +1,162 @@ +Release Notes for Rainbow Viewer::Cool Edition 1.22.12 Release 13, April 20th 2010 +================================================================================== +Rainbow Viewer::Cool Edition is a speed Metaverse Client that can connect you to a huge variety of exciting Virtual Worlds! + +You can find more information and downloads on the following websites: +http://my.opera.com/boylane (blog) +http://coolviewer.googlecode.com (installers) +http://github.com/boy (source code) + +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 apologize. + +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, especially the people involved and behind Imprudence! + + +Patches by Aimee Trescothick: +* AmbiantMasterVolume: Fixes the issue with ambient 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 Aleric Inglewood +* InvisibleAvatars: Avatars completely invisible when first in sight, except for attachments; zooming in fixes it. (VWR-13996) +* LLimageTGA_DeleteColorMapFix: fixes a memory leak (VWR-10837). + +Patches by Armin Weatherwax +* ShowLookAtFix: Fixed a possible crash related to ShowLookAt targets + +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". +* AlphaTattooLayers: backport from SL2.0, thanks to Henri for the patches for 1.19 and 1.23 this is based on +* 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. +* AVShapeExportImport: Baed on Emerald, this patch allows the Export and Import of avatar shapes (creator only) +* CompilerOmitFramePointers: fix some default compiler optimizations. +* DisallowLindenHairRemoval: fix for RLV that prevents removal of hair/hairbase that leads to unrezzed AVs +* GPU_Table: adds a new GPU table of supported graphic cards from Snowglobe +* Incomplete OblongSculpties: backport from 1.23 that fixes incomplete rendering of some sculpties +* JigglyBewbz: Breast physics aka jiggly bewbz from Emerald. Complicated confguration left in debug settings. +* 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 Henri Beauchamp to the 1.22 viewer. Radar button in toolbar. +* 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. +* TemporaryTextureUpload: based on Emerald this allows the upload of textures without paying for testing purposes only +* Verified OpenSim grids: tested and updated list of grids to choose from on startup +* 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 flaky 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. +* GtkFilePickerFilterLoadXML: fixes a bug with the GTK file picker when trying to load a XML file (the *.xml filter was not set). +* 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. +* ImageGLPickMaskCrashFix patch: fixes a bug that sometimes crashes the viewer when touching (or caming on) an object which is being rezzed. +* 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 rezzing 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). +* SaveScriptsAsMono: Allows to save scripts in inventory as Mono scripts instead of LSL2 (when the SaveScriptsAsMono setting is set to TRUE). Fixes VWR-8827. +* SaveTextureAsFileExtension: fixes a problem with textures being saved without the proper .tga filename extension. +* SearchDescAndCreator: based on Emerald, this patch allows to search the inventory for matching words in item names (default and normal behaviour) and/or item description and/or item creator. +* SpeedRez_v2: "speeds up" rezzing (actually rez closer objects first) on login and teleports, by temporarily reducing the draw distance to 32m and stepping it back up to its original value at a regular interval of time after login/TP. This feature is enabled when the SpeedRez variable is set to TRUE, and the interval may be adjusted via the SpeedRezInterval variable (defaults to 12s). +* TeleportHistory_RestrainedLife_addon: addon patch for usage restrictions of TeleportHistory with RestrainedLife active. +* UnknownJointsCrashFix: fixes some crashes that can occur when encountering avatars wearing objects on unofficial attachment points. + +Patches by Jacek Antonelli +* LocalRulerAlignment: Fixes a problem with the edit tools in "Local" ruler mode (VWR-1852). +* PaymentMessage: Optional text for payments to show up in transaction history + +Patches by Kitty Barnett: +* BuildFloaterMouseLookQuirk: Fixes a quirk with mouse-look in build mode (VWR-14767). +* NotecardScriptSearchReplace: adds a search/replace feature. +* PanelLoginFocusedGridSelectionCrash: fixes a crash bug when quitting the viewer while the grid selection combo is selected (VWR-14765). + +Patches by KOW +* DisabledViewerStats: Disables sending of viewer statistics to LL + +Patches by Marine Kelley: +* RestrainedLove_v1.23 with improvements by Henri Beauchamp + +Patches by Mm Alder: +* LoadXUIfromXML: Fixes a bug in the Advanced/XUI/Load from XML feature (VWR-14475). + +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 friendship 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). +* OblongSculptiesDetails: this patch increases the level of details (LOD) for oblong sculpties (sculpties using a sculpt texture with different width and height) when necessary. +* 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. +* HighFPSwithSlowLinkLag (by Zwagoth Klaar): helps preventing lag spikes on high performance computers with poor Internet uplink bandwidth. Fixes VWR-1488. +* 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). +* 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. +* 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). +* MakeOutfitButtons: check/uncheck all buttons for make outfit from Meerkat viewer +* 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. +* PreviewAnimInWorld: from Emerald, this patch allows to preview animations on your own avatar prior to uploading. +* 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) +* RezWithLandGroupWhenPossible (unknown author, comes from Emerald): allows (when the RezWithLandGroup setting is set to TRUE) to rez object with land group when possible (i.e. if your avatar belongs to that group). +* 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. +* StopAllAnimations: backport from v1.23 of the true "Stop Animating My Avatar" tool, to replace the old and useless (since client-side only) "Stop All Animations" tool. +* 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. + diff --git a/linden/indra/newview/RestrainedLoveReadme.txt b/linden/indra/newview/RestrainedLoveReadme.txt new file mode 100644 index 0000000..2a3081f --- /dev/null +++ b/linden/indra/newview/RestrainedLoveReadme.txt @@ -0,0 +1,701 @@ +This is the edited version of the original readme file by Marine Kelley. +The file has been edited to take into account the improvements by Henri Beauchamp, as well as the Cool SL Viewer. + +------------- +Version 1.23a + + +WHAT IS IT ? +------------ + +RestrainedLove is aimed at BDSM fans in SL who wish to enhance their experience by letting other people (such as their owners) take control of some of their abilities. In order to use its features, the Dom/me has to operate items (typically restraints) that the sub wears, but only the sub needs to use this viewer in that situation. Here is what a Dom/me can do to a sub who uses this viewer with RestrainedLofe enabled: + +- Make an item undetachable (once locked, the sub has absolutely no way to detach it unless they relog with a different viewer or the item is unlocked). +- Prevent sending IMs, receiving IMs, sending chat or receiving chat (with exceptions if needed). +- Prevent teleporting (from the map, a landmark, or by a friend with exceptions if needed). +- Prevent rezzing, editing, using inventory, reading notecards, sending messages on non-public channels (again with exceptions if needed). +- Prevent standing up and force sitting. +- Prevent adding/removing clothes, force removing clothes and force detaching worn items (unless made undetachable). +- Force attaching clothes and items that are "shared" in the user's inventory (see below) +- Force teleporting the sub to an arbitrary location, without the ability to either refuse or cancel the teleport +- Hide names and/or location so that the sub cannot know who is around, or where they are + +These features, when cleverly used together, make the sub truly *feel* the power of their Dom/me. Tested and approved by a lot of slaves. + +Lockable items in SL work perfectly without this viewer but if you use it you'll find your experience... enhanced. But you don't *need* it to use them. Moreso, the Dom/me does not even need to use it at all, since it is made to enhance restraints (which are worn by the sub). + + + +HOW TO ENABLE RESTRAINEDLOVE ? +--------------------------- + +- Get the Cool SL Viewer from http://sldev.free.fr/ for Linux or Windows, or from Hyang Zhao's blog for MacOS X (link to be found on http://sldev.free.fr/). +- Install the Cool SL Viewer following the instructions given on the download site. +- Start the viewer and log in. +- Open the preferences menu of the viewer. +- Select the "Cool features" tab. +- Select the "Miscellaneous" sub-tab. +- Check the "RestrainedLove mode" checkbox in this tab. +- Close the menu. +- Log off and quit the viewer. + +Now, your viewer is RestrainedLofe enabled and you may log on again. + + + +A WORD ABOUT SHARED FOLDERS +--------------------------- + +Read on, and also visit http://realrestraint.blogspot.com/2008/08/objects-sharing-tutorial.html for a tutorial explaining how to share folders properly, both with mod and no-mod objects. + +Since v1.11, the viewer can "share" some of your items with scripts in world in order to let them force you to attach, detach and list what you have shared. + +RL viewer v1.13 or above is able to share multiple levels of sub-folders to facilitate organization. + +"Share" does NOT mean they will be taken by other people if they want to (some of the items may be no-transfer anyway), but only that they can force YOU to wear/unwear them at will through the use of a script YOUR restraints contain. They will remain in your inventory. + +To do this : +* Create a folder named "#RLV" (without the quotes) directly under "My Inventory" (right-click on "My Inventory", select "New Folder"). We'll call this folder the "shared root". +* Move a folder containing restraints or other attachments directly into this new folder. +* Wear the contents of that folder, that's it ! + +So it would look like this : + + My Inventory + |- #RLV + | |- cuffs + | | |- left cuff (l forearm) (no copy) + | | \- right cuff (r forearm) (no copy) + | \- gag + | \- gag (mouth) (no copy) + |- Animations + |- Body Parts + . + . + . + +For example : If you're owning a set of RR Straps and want to share them, just move the folder "Straps BOXED" under the shared root. + +Either wear all the items of the folders you have just moved (one folder at a time !) or rename your items yourself, so that each item name contains the name of the target attachment point. For example : "left cuff (l forearm)", "right ankle cuff (r lower leg)". Please note that no-modify items are a bit more complex to share, because they cannot be renamed either by you or by the viewer. More on that below. + +The attachment point name is the same as the one you find in the "Attach To" menu of your inventory, and is case insensitive (for example : "chest", "skull", "stomach", "left ear", "r upper arm"...). If you wear the item without renaming it first it will be renamed automatically, but only if it is in a shared folder, and does not contain any attachment point name already, and is mod. If you want to wear it on another attachment point, you'll need to rename it by hand first. + +Pieces of clothing are treated exactly the same way (in fact they can even be put in the folder of a set of restraints and be worn with the same command). Shoes, for instance, are a good example of mixed outfits : some attachments and the Shoes layer. Clothes are NOT renamed automatically when worn, since their very type decides where they are to be worn (skirt, jacket, undershirt...). + +HOW TO SHARE NO-MODIFY ITEMS : +As you already know, no-mod items cannot be renamed so the technique is a bit more complex. Create a sub-folder inside the outfit folder (such as "cuffs" in the example above), put ONE no-modify item in it. When wearing the object, you'll see the folder itself be renamed (that's why you must not put more than one object inside it). So if your outfit contains several no-mod objects, you'll need to create as many folders and put the no-mod objects in them, one in each folder. + +Example with no-modify shoes : + + My Inventory + |- #RLV + | \- shoes + | |- left shoe (left foot) + | | \- left shoe (no modify) (no transfer) <-- no-mod object + | |- right shoe (right foot) + | | \- right shoe (no modify) (no transfer) <-- no-mod object + | \- shoe base (no modify) (no transfer) <-- this is not an object + |- Animations + |- Body Parts + . + . + . + +GOTCHAS : +* Do NOT put a comma (',') in the name of the folders under the shared root or it would screw the list up. +* Don't forget to rename the items in the shared folders (or to wear these items at least once to have them be renamed automatically) or the force attach command will appear to do nothing at all. +* Avoid cluttering the shared root (or any folder under it) with many sub-folders, since some scripts may rely on the list they got with the @getinv command and chat messages are limited to 1023 characters. Choose wisely, and use short names. But with 9 characters per folder name average, you can expect to have about 100 folders available. +* Remember to put no-modify items in sub-folders, one each, so their names can be used by the viewer do find out where to attach them. They can't be shared like modify items since they can't be renamed, and the outfit folder itself will not be renamed (since it contains several items). + + + +WHAT DOES IT DO IN DETAIL ? +--------------------------- + +Let's go down to business. There are 2 kinds of modifications : + +* Permanent modifications. These are the ones that apply all the time, whether you're wearing a locked item or not: +- You cannot choose your log in location (it always log you in your last location). +- Automatic IM answer to anybody who sends "@version" (lowercase) to you, the viewer will answer its version so it's a quick way to check if a sub is using it or not. Note : some uneducated people send unsollicited "@version" IMs to check other people's viewers, without saying "Hi" or anything else. People using regular viewers do see these unsollicited IMs and associate them with spam, possibly going as far as ARing the initiator. I cannot be held responsible for that, just don't do this to people you don't know. + +* Global modifications : These are the ones that occur when an object triggers them, modifying the global behaviour of the viewer, such as: +- No IM +- No chat +- No read notecards +- etc... + +* Temporary modifications. These are the ones that occur when an object is locked on your avatar. +- No HUD attachments hiding. If you don't know what I mean don't ask, but that's a way to cheat restraints that prevent you from interacting with your environment, you can't cheat here. +- No Wireframe view (same remark as above). +- No "Dump All Attachments" (same remark as above). +- No "Attach To" or "Wear" when right clicking on an object in world. That could kick a locked object otherwise. +- "Edit" > "Detach Object..." in the top menubar is not working on locked objects. +- No "Release Keys" button (this is independant from the HideReleaseKeys setting of the Cool SL Viewer) and the "Tools" > "Release Keys" item in the top menubar is inactive. +- No Drag-and-drop of objects and folders from your inventory to your avatar. +- No "Detach and Drop" on the Pie menu (right click on it in-world). +- No "Detach" on the Pie menu when right clicking on your avatar. +- No "Detach All" on the Pie menu when right clicking on your avatar. +- "Attach To" from the inventory: if you try to attach on an attach point that contains a locked object will do nothing. It works for other attach points though, of course. +- No Detach from Yourself menu item in the inventory on locked objects. +- No "Tools" > "Reset/Recompile" scripts in selection on locked objects. +- No New Script on a locked item. +- No "Add to Outfit", "Take Off Items" from the folders menu actions while wearing a locked item as they do the same thing as "Wear" (see below). +- No "Wear" menu item in the inventory when you're wearing at least one locked object (*) +- No attach/detach by double-clicking on objects in the inventory (Cool SL Viewer feature). +- No modifying the inventory of a locked item + +(*) : a bit harsh indeed... but it's the only solution for design reasons (regular viewer design that is). When trying to Wear an object, the viewer does not know where to attach the item so it waits for the server to send an "attach there" message, and the viewer has no choice but to comply. You may "Attach To" instead but be very careful with it: know where your object has to attach first or you'll end up having to reposition it by hand. It might be a good idea to rename the objects (when they are mod-ok) so that their normal attachement point is appended to their name. + +Since 1.11 you are able to use Wear again if the name of the object contains the name of an attachment point (named like the ones in the "Attach To" submenu). This fake Wear is actually a disguised Attach To command. + +Since v1.21a you may set the RestrainedLofeAllowWear advanced setting to TRUE so to allow the Wear commmand again on all items. In this case, the RestrainedLofe code will attempt to reattach automatically any kicked off locked item. However, be warned that because of a serious bug in the asset server (see https://jira.secondlife.com/browse/SVC-3579), attachments that are reworn too fast (less than 15 seconds or so, but up to 30 seconds, depending on asset servers lag) after being detached will loose all the modifications (including script states) that were made to them after the last time they were attached or the last time you TPed or logged in with them on (whichever occured last). Starting from RestrainedLofe v1.22f, you may use the RestrainedLofeReattachDelay advanced setting (defaults to 15s) to adjust the reattach delay. + + +RELEASE NOTES : +--------------- +1.23a (@versionnum = 1230001) by Henri Beauchamp: +- Inclusion of Marine Kelley's change: + - changed : The name of the viewer itself. It is still known as "the RLV", but the meaning of the letters "RLV" change from "Restrained Life Viewer" to "Restrained Love Viewer". This is due to the Third Party Viewer policy that Linden Lab has published on 02/22/2010, forbidding to use the word "Life" or any synonym in the name of a Third Party Viewer such as the RLV. + - added : due to the name change, a new command appears : @versionnew, which returns "RestrainedLove viewer v1.23.0 (SL 1.23.5)". The old @version command still does the same as before, i.e. return "RestrainedLife viewer v1.23.0 (SL 1.23.5)", but you are encouraged to not use this command anymore in new scripts, and to do your best to hide the name "RestrainedLife" from the user. Use "RestrainedLove" instead, or better, "RLV". +- Changed: commands taking a channel number to send their reply to now accept negative channels (handy to prevent cheating during RestrainedLove detection, e.g. @version=-1 prevents the user to cheat since they can't chat on a negative channel and spoof a RestrainedLove viewer reply on it). Note however that the length of the message returned by the commands on negative channels cannot be greater than 255 characters (instead of 1023 for positive channel numbers), so a negative channel number is not a good choice for commands that could return long strings (such as @getstatusall or @getinv, for example). + + +1.22h (@versionnum = 1220106) by Henri Beauchamp: +- Added: support for the new Alpha and Tattoo wearable (in @getoufit, @remoutfit, etc). Note that for compatibility reasons, the Alpha and Tattoo flags appear (in this order) after the shape flag in the string returned by @getoutfit=. +- Changed: The "Hair" bodypart cannot anymore be removed with @remoutfit. This is because baked hair is now a requirement in v2.0 and later viewers, and an avatar without hair may also result in an unrezzed avatar in v1.23 anyway. If you want to hide the hair bodypart, you can use the new Alpha wearable. + + +1.22g (@versionnum = 1220105) by Henri Beauchamp: +- Fixed: @redirchat does not truncate emotes any more, like originally intended and documented in the API. + + +1.22f (@versionnum = 1220104) by Henri Beauchamp: +- Changed: code cleanup. +- Changed: reworked the auto-reattachment feature to make it more reliable and to avoid state loss in reattached items and allow retries on reattach failures. New RestrainedLofeReattachDelay advanced setting implemented. + + +1.22e (@versionnum = 1220103) by Henri Beauchamp: +- Changed: Speed optimization relative to the RestrainedLofeDebug flag. + + +1.22d (@versionnum = 1220102) by Henri Beauchamp: +- Added: a RestrainedLofe sub-menu in the Advanced menu of the viewer (or Client menu for v1.19.0.5), allowing to easily toggle the advanced RestrainedLofe settings. +- Fixed: a bug introduced in Marine's v1.22 and that made the "Empty Lost And Found" item vanish from the "Lost And Found" folder context menu. + + +1.22c (@versionnum = 1220101) by Henri Beauchamp (equivalent to Marine's v1.22.1): +- Inclusion of Marine Kelley's change: + - changed (*): The user is now able to focus their camera on objects even through a HUD (except when in Mouselook). This is handy for people who like to spend time bound and "blocked" (meaning their clicks are intercepted by a huge HUD prim across their screen), but who dislike being unable to focus. +(*) does not (yet) apply to viewer v1.19.0.5. + + +1.22b (@versionnum = 1220002) by Henri Beauchamp: +- Fixed: crash bugs that could occur while the avatar is rezzing (during logins or after TPs), especially when the viewer window is minimized or not displayed (i.e. on another workspace than the current one). + + +1.22a (@versionnum = 1220001) by Henri Beauchamp (equivalent to Marine's v1.22): +- Inclusion of Marine Kelley's changes: + - fixed : inventory context menu would not refresh properly after everything is unlocked. + - added : @addattach and @remattach commands, to do what the old @detach:point=n command did (this command keeps being valid, and must be seen as an alias to @addattach and @remattach used at the same time). Thanks to all who gave their opinions and allowed a little brainstorm on this one ! + - added : @viewscript and @viewtexture, which work exactly like @viewnote, on scripts and textures (and snapshots) respectively. Thank you Yar Telling for the hint ! +- Adaptation of the new code to v1.19.0.5. +- Minor cleanup and optimizations. + + +1.21a (@versionnum = 1210101) by Henri Beauchamp (equivalent to Marine's v1.21.1): +- Inclusion of Marine Kelley's changes from v1.21: + - fixed : A clever way to cheat around @shownames (thank you Talisha Allen). + - changed (1): Reinstated "Wear" on the contextual menu even when something is locked and no attach point is contained in the name of the item. This holds the risk of kicking a locked object off, but it will be reattached automatically after 5 seconds anyway. Even "Add To Outfit" and "Take Off Items" work. This was a MUCH awaited feature ! + - changed : Added support for reattaching several objects at the same time. Objects will be reattached at 1 second interval. + - added : @defaultwear restriction. When this restriction is set, the "Wear" command will work like it did before this version, i.e. disappear if something is locked and no attach point information is contained within the name. This is for subs who tend to abuse the Wear menu and kicking off locked objects a little too often. + - added : @versionnum command to retrieve the version number directly, instead of having parse the "RestrainedLofe viewer v1.20.2 (1.23.4)" string. Here it will return "1210000". + - added : @permissive command that tells the viewer that any exception to @sendim, @recvim, @recvchat, @tplure, @recvemote and @sendchannel MUST come from the object that issued it or will be ignored (without this command, any object can set an exception to the restrictions issued by any other object). + - added : @sendim_sec, @recvim_sec, @recvchat_sec, @tplure_sec, @recvemote_sec and @sendchannel_sec to do the same as @permissive, but one restriction at a time (i.e. exceptions to @sendchannel from other objects won't be ignored if @sendim_sec is set). +- Inclusion of Marine Kelley's changes from v1.21.1: + - fixed : locking attachment points was not working anymore. + - fixed : massive reattach after an "Add To Outfit" command could fail with a "pending attachment" kind of error message in laggy areas (thank you Henri Beauchamp). + - changed (2): "Add To Outfit", "Take Off Items" and "Replace Outfit" menu items will be hidden if something is locked (object or clothing) inside the folder you have selected, or any of the folders it contains, recursively. + - known issue : These menu items will be hidden even if there are only clothes in the folder and none of them is locked, but another piece of clothing is locked specifically (for instance, you are trying to unwear pants, but the shirt is locked). This is because of a limitation in the code and will be corrected in a future version. +- Work around for (1): Allowing the "Wear" command in inventory context menus makes it possible to have locked attachments kicked. Theorically, the RestrainedLofe code is able to reattach these kicked locked attachments. Alas, and because of the low reliability and extremely variable delays encountered when asset server operations are involved, the reattachment may fail. This is why I implemented a new debug setting ("RestrainedLofeAllowWear"): when FALSE (which is the default), the "Wear" command is unavailable and RestrainedLofe behaves like in v1.20 and previous versions. When TRUE, the "Wear" command availability is goverened by the @defaultwear command (i.e. "Wear" is available by default), like in Marine's v1.21. +- Work around for (2): Because of automatic reattachment failures, "Add To Outfit", "Take Off Items" and "Replace Outfit" are for now disabled (when at least one worn attachment is locked) for all folders and not just for folders containing locked items. + + +1.20c by Henri Beauchamp (equivalent to Marine's v1.20.2): +- Inclusion of Marine Kelley's changes: + - fixed : a nasty crash when reattaching a locked object, introduced in 1.20. Thanks to all who helped tracking this down. + - fixed : a workaround @tplm that was supposedly fixed in 1.20. +- Code clean up and optimizations. + + +1.20b by Henri Beauchamp (equivalent to Marine's v1.20.1): +- Inclusion of Marine Kelley's changes: + - fixed : crash to desktop when hearing chat from an unrezzed avatar while under @shownames (bug introduced in 1.20). + - fixed : crash to desktop when forcing an object to be detached then locking its attach point right away, which would trigger an infinite loop (introduced in 1.20). + - fixed : a cheat around @shownames (thanks Jolene Tatham). (*) +(*) Did not affect the Cool SL Viewer v1.19.0.5. + + +1.20a by Henri Beauchamp (equivalent to Marine's v1.20): +- Inclusion of Marine Kelley's changes: + - added : @notify command to let scripts be notified when a particular restriction (or just any restriction) is issued or lifted by an object. It does not disclose the object itself, just the fact a restriction has changed. (thank you Corvan Nansen for the idea) + - added : @detach: command to lock a particular attachment point. When using this command, any object worn there is locked on, even if it is not even scripted, and no other object can kick it off. If the attachment point is empty, this command will lock it empty, even if another object is attached to it with llAttachToAvatar(). (thank you Chorazin Allen for the idea) + - changed : improved the attachment point calculation in the names of inventory items. Now it looks from right to left (to be consistent with how the RLV renames items when worn), and will select the candidates with the longest names first. In other words, it makes the RLV ready if the number of attachment points is increased (like adding "chest (2)" and the like). + - changed : hide custom text in friendship offers when unable to receive IMs. + - fixed : HUDs and unrezzed objects and avatars were immune to @recvchat (they could always be heard). (thank you Jennifer Ida for reporting this) +- Code clean up and optimizations. + + +1.19b by Henri Beauchamp: +- Never redirect (@redirchar, @rediremote) Out Of Character chat (text starting and ending with double parenthesis): the players must be able to safeword or voice a personal problem/concern. + + +1.19a by Henri Beauchamp (equivalent to Marine's v1.19): +- Inclusion of Marine Kelley's changes: + - added : now allows to hide the hovertext floating over one prim in particular (not necessarily the one that issues the command), or all the hovertexts, or only the ones on the HUD, or only the ones in-world. Thank you Lyllani Bellic for the idea. + - added : @rediremote to redirect emotes to private channels like @redirchat does. Now that one was a popular request ! + - added : @recvemote to prevent hearing emotes like @recvchat prevents hearing chat, also with exceptions. Not as popular but as handy ! + - changed : Now the hovertexts are refreshed immediately when issuing some of the RLV commands (sounds easy, but it was a pain in the **** to implement). + - fixed : @acceptpermission was broken in 1.18. Partly my fault, sorry. + - fixed : chat messages in history were showing a weird dot (".") on a single line when prevented from hearing chat. An old bug. + - fixed : @getpath didn't work in a child prim. Thank you Henri Beauchamp for the tip. + - fixed : "@attach:main=force" unified with ".Backup (main)" ! + + +1.18a by Henri Beauchamp (equivalent to Marine's v1.18): +- Inclusion of Marine Kelley's changes: + - changed : now showing (PG), (Mature) or (Adult) even when the location is hidden. + - fixed : the world map and minimap buttons were not turning themselves off properly when @showloc was issued while they were activated. + - fixed : now unable to chat on CHANNEL_DEBUG while under @sendchat (thank you Sophia Barrett). + - fixed : "so and so gave you..." now hides the name while under @shownames. + + +1.17b by Henri Beauchamp: +- changed: removed the "llOwnerSay() beginning with two spaces not displayed to RL users" feature (introduced by Marine in v1.16), since it breaks existing scripted items that have nothing to do with RestrainedLove... + + +1.17a by Henri Beauchamp: +- fixed : allow again non-prim hair to be removed via @remoutfit. +- fixed : a crash bug when the #RLV folder is missing and llGiveInventoryList() is used to give a sub-folder to #RLV. +- changed: do not prevent "Go To" or DoubleClickAutoPilot when some device is locked (which does not make sense), but only when llTakeControl() was used to take control on CONTROL_FWD (thus preventing to override any speed limitation or movement restriction). +- Inclusion of Marine Kelley's changes (from v1.17): + - fixed : visual clues about the map and minimap were a bit... clueless at times. + - changed : don't go to third view while in Mouselook and switching back to SL from another application. Doesn't work if the window was minimized or hidden (on MacOS X for example). + - changed : don't allow partial matches on folders prefixes with a "~" character anymore, to avoid taking precedence over the "regular" folders. Thank you Mo Noel for the heads up. + - changed : now PERMISSION_TRIGGER_ANIMATION is also granted when sitting while @acceptpermission is active, even if the object we are sitting on does not actually contain the animation. Useful for rezzable poseballs. + - added : @setrot:angle=force. This command allows you to make the avatar turn to a direction, in radians from the north. This is not possible through a LSL function call so here it is. Be aware that this command is not more precise than the llGetRot() LSL call (for instance the avatar won't rotate if the rotation is less than a few degrees), but it is better than nothing. It is much more precise while in Mouselook, and does not do anything while sitting. + + +1.16g by Henri Beauchamp: +- Inclusion of Marine Kelley's changes (from v1.16.2): + - fixed : RLV rarely forgets to activate restrictions on relog in particularly laggy areas. This was due to the viewer calling its garbage collector too early, hence clearing restrictions while the restraints had not rezzed yet. The solution I used to fix that is very simple (don't call the garbage collector before a few minutes on startup), but that should do the trick. + - fixed : RLV checking whether you had locked HUDs at every frame. Now cached to improve performance. + - fixed : @shownames was showing "An unknown person" for about 20% of the people around. Well silly me. Using a signed char (-128 > +127) for a positive hash (0 > 255) was not a brillant idea. (*) + - fixed : minor memory leak in RRInterface::forceAttach. (*) + - fixed : @unsit was not always unsitting you. This bug has been there since the beginning and was very annoying. (*) + - fixed : a few clever partial workarounds for some restrictions... (*) + - fixed : @chatshout and @chatwhisper were also changing the range of the automatic viewer responses. + - fixed : @remoutfit:xxx=force also allowed to remove bodyparts (but it was not visible on the screen). + - fixed : @acceptpermission was too... permissive. + - removed : @denypermission is now deprecated. It was there to prevent a script from kicking a locked object with a llRequestPermissions(PERMISSION_ATTACH) followed by a llAttachToAvatar() but since locked objects now automatically reattach themselves, this restriction makes no sense anymore and is only annoying people who do want their HUDs to attach automatically. + - changed : removed the throttle on permissions concerned by @acceptpermission (since we don't see the dialogs anyway). Thank you Mo Noel for reporting this. + - added : Visual clues on the lower toolbar : Map, Minimap, Build and Inventory now update themselves according to their respective restrictions. (*) (1) + - added : @detachme=force. This "simple" command just makes an attachment detach itself and only itself if not locked. There was a need (even if a script could do it with a llDetachFromAvatar call, after granting permission) because the script needs to make sure the restrictions are cleared before detaching, by issuing a @clear,detachme=force list of commands. Before that, you had to call "@clear", wait a little, then detach the item and pray that it would not reattach itself after 5 seconds. + - added : @sit=n. This simple restriction has been added to reinforce the security of most cages, in which the prisoner does not have any opportunity to sit anyway. Thank you Chorazin Allen for the idea. +- changed : Inventory offers to #RLV is now enabled by default (since it is now officialy supported in Marine's v1.16.2). It can be disabled by setting RestrainedLofeForbidGiveToRLV to TRUE. +- bugfix: fixed a bug in (1) (see above) which prevented the toolbar "Build" button to get properly updated when RestrainedLofe is disabled. + + +1.16f by Henri Beauchamp: +- changed: @putinv has been removed and only the #RLV/~folder redirection has been kept (meaning a standard Keep/Discard/Mute dialog is always presented to the user). This inventory redirection is only active when the RestrainedLofeAllowGiveToRLV environment variable is set to TRUE. + + +1.16e by Henri Beauchamp: +- fixed: removed the (undocumented) limitation that made it imposible to force-sit an avatar under @fartouch=n restriction (bug introduced in v1.16), as it breaks existing contents and is very disputable. +- changed: @putinv now only accepts #RLV/~folder (the tilde prefix is mandatory) for items given via llGiveInventoryList(), and cannot be used by an item held into such a #RLV/~folder. + + +1.16d by Henri Beauchamp: +- changed: @putinv is now disabled by default and can be enabled by setting the RestrainedLofeAllowPutInv debug setting to TRUE. +- changed: when @putinv is in force, do not hide any more in the chat log the name of the folder given via llGiveInventoryList(id, "#RLV/folder", list_of_stuff). + + +1.16c by Henri Beauchamp: +- Inclusion of Marine Kelley's changes (from v1.16.1): + - fixed : removed a way to force an avatar to talk on channel 0. Thanks Maike Short + - fixed : @getinvworn would return wrong results when a modifiable object was contained inside a folder named ".(right hand)", for instance. Thanks Satomi Ahn + - fixed : the viewer would not automatically answer RLV queries when minimized or hidden on MacOS X + - fixed : a clever cheat around @showloc + - fixed : a clever cheat around undetachable HUDs. + - fixed : @getpath:shirt would return the path to the shirt item even if it was not shared. + - changed : "dummy names" begin with a capital again. It was a try, but it didn't look good. + - changed : first and last names only won't be hidden anymore, only full names. Thanks and sorry Mo "My short name messes my dialog boxes up !" Noel + - added (1): when a locked object is detached anyway, by any means, it is automatically reattached 5 seconds later (not sooner, to avoid rollbacks), and in the meantime every RLV commands are ignored to avoid infinite loops. + (1) This feature does not work with llDetachFromAavatar(). See the work around below. +- fixed: crash bug while under @fartouch restriction and CTRL-selecting a prim. Fix by Kitty Barnett. +- fixed: a glitch allowing to circumvent the @fartouch restriction. Fix by Kitty Barnett. +- fixed: a couple of bugs in v1.16.1 changes above. +- work around: when a locked object is detached and fails to be reattached (see (1) above), do not block the RLV commands after the reattach delay has elapsed. +- changed: changes to RestrainedLofeAllowSetEnv now only take effect after a viewer restart, so to be consistent with Marine's v1.16.1 RLV behaviour. Note that Marine's RLV v1.16.1 still does not handle correctly this flag (@setenv=n is still possible with Marine's code when RestrainedLofeAllowSetEnv is TRUE, which is a bug). +- added: new @putinv:avatar_id=add/rem command, allowing avatar_id to issue (via a relay if avatar_id != victim_id) llGiveInventoryList(victim_id, "#RLV/subfolder", list_of stuff), so that objects ("list_of_stuff") is added to the #RLV folder of victim_id, into a new "subfolder". Adapted from a proposal and patch by Saunuk Flatley. + + +1.16b by Henri Beauchamp: +- Fixed the @getdebug_* and @setdebug_* bugs. +- Removed the llGetAgentLanguage() identification method as it is going to be removed from Marine's RL 1.16.1 and breaks some existing contents. + + +1.16a by Henri Beauchamp (equivalent to Marine's v1.16): +- Inclusion of Marine Kelley's changes: + - fixed (1) : improved touch. Now the viewer compares with the actual point the user clicks on, instead of the center of the root prim. + - fixed : could bypass the @sittp restriction under special conditions (depending on the sit target). + - fixed : improved speed (muchly) while under many restrictions, by caching them. + - added : @accepttp restriction has been extended to accept TP offers from anyone when no parameter is given (before a parameter was mandatory). + - changed : now even hovertexts and dialog boxes are "censored" when prevented from seeing names or location. This will make it difficult to cheat with a radar now ! + - changed : friends won't show in yellow in the minimap under a show names restriction (it is a new feature in the SL viewer v1.22.*). + - added : @setdebug and @getdebug, working exactly like @setenv and @getenv, but for debug settings. For the moment only AvatarSex (to get/set gender) and RenderResolutionDivisor (to make the screen blurry) are accepted. All the other debug settings are ignored. + - added : @redirchat to redirect chat spoken on channel 0 to any other private channel, thusly prevent the user from speaking on channel) 0 at all (not even a "..."). This does not apply to emotes, and if several @redirchat restrictions are issued, all of them are taken into account (i.e. chat will be dispatched over several channels at once). This was a very popular request ! + - changed : @getstatus now prepends a slash ("/") before the returned message to prevent from griefing. This does not confuse llParseString2List() calls in a script, but does confuse llParseStringKeppNulls(). + - changed : the case is now ignored when names are censored. + - added : @getpath to get the path from #RLV to the object, or to the object which occupies the attachment point given as parameter, or to the piece of clothing given as parameter. The object or clothig must be shared, otherwise it returns nothing. + - added : @attachthis, @attachallthis, @detachthis, @detachallthis commands, which are shortcuts to a @getpath call followed by an @attach, @attachall, @detach or @detachall command respectively. Very handy to manage outfits without breaking the privacy of the user's inventory ! + - added : if an owner message (llOwnerSay) begins with two spaces, it will be hidden to the user. Like a remark or a comment. Regular viewer users will see it normally, of course. + - changed : added many more "dummy names" for the @shownames restriction. There are 28 of them now. The hash function should be better as well, it was choosing the name based on the length of the name of the avatar before, which could end up in many times the same name around, confusing the user. + - fixed : don't prevent teleporting when unable to unsit but not currently sitting. + - added (1): when a script calls llGetAgentLanguage() on a RLV user, the result will be "RestrainedLofe Viewer v1....", exactly like a @version call. The user cannot prevent the viewer from returning this, no matter which language they are using and whether they have checked the "make language public" checkbox or not. This is experimental, if it bothers too many people I will remove it in the next version, but not later. In other words, if it is still there in the next version, it will stay there. + - added : @acceptpermission to automatically accept permissions to attach and to take controls, @denypermission to automatically deny those permissions (the latter takes precedence over the former, of course). + - fixed : a small cheat around @sendchat. Thank you Vanilla Meili ! +(1) This does not apply to v1.19.0.5 based viewers since it relies on code present in v1.21 or later viewers. + + +1.15c by Henri Beauchamp (equivalent to Marine's v1.15.2): +- Inclusion of Marine Kelley's changes: + - fixed : invisible folders (starting with ".") were taken into account in the @attachall command + - fixed : items that are neither objects nor pieces of clothing were taking into account in the @getinvwon command + - fixed : skin and hair did not register in the @getinvworn command + - fixed : viewer was freezing when using @getinvworn while RLV debug is active. Thank you Mastaminder McDonnell ! + - fixed : @getinvworn was seeing every item contained directly under #RLV, but did not allow the user to attach nor detach them. As #RLV is not an outfit, now @getinvworn ignores them + - changed : now when the user is unable to edit things, they are also unable to see any beacon, including invisible objects +- fixed: because of a typo, RestrainedLofeAllowSetEnv was not working properly. It has been replaced by RestrainedLofeNoSetEnv (to ignore both @setenv and @setenv_* commands when set to TRUE) and is now working properly. + + +1.15b by Henri Beauchamp (equivalent to Marine's v1.15.1): +- Inclusion of Marine Kelley's changes: + - fixed : an empty shared folder would, in certain cases, mess the information provided by @getinvworn (saying nothing to wear while there are items there). Thank you Julia Banshee ! + - fixed : a piece of clothing alone in a folder, and no-mod would be treated as a no-mod object + - fixed : a no-mod object which name contains the name of an attachment point would use it even if it was contained inside a folder which name contains another attachment point. Thank you Charon Carfagno ! +- added: implemented the RestrainedLofeAllowSetEnv flag (TRUE by default) to allow or forbid (when set to FALSE) environment (day time, Windlight) changes via @setenv_* commands. +- added: implemented @getenv_daytime for v1.19.0.5 viewers. + + +1.15a by Henri Beauchamp (equivalent to Marine's v1.15): +- Inclusion of Marine Kelley's changes: + - fixed : order of HUD attachments would make a "top" HUD attach to "top left" and a "bottom" HUD attach to "bottom right", messing them. + - fixed : detaching a shared folder through a script would also detach one item from a sub-folder regardless of its perms (it was done so primarily for no-mod items before instating sub-folder sharing). Thank you Mastaminder McDonnell for the bug report ! + - fixed : prevent grabbing/spinning when unable to edit things as well. + - fixed : an old loophole that surfaced again. Thanks TNT74 Pennell and Giri Gritzi ! + - fixed : @setenv_densitymultiplier and @setenv_distancemultiplier were not accurate + - changed : when trying to attach/detach a folder through a script, whatever is after a pipe ("|") in the name is ignored (pipe included). This is for convenience after using the @getinvworn commmand. + - changed : now unable to teleport when unable to unsit (that needed unnecessary additional restrictions such as a leash that was not really needed) + - added : @accepttp command to force the sub to accept a teleport from someone (not necessarily a friend). This does not deprecate @tpto which teleports to an arbitraty location, while @accepttp teleports to an avatar. To the sub it will look like they have been teleported by a Linden (no confirmation box, no Cancel button). + - added : @getinvworn command to which folders are containing worn items. It roughly works like @getinv, with more information... but it's quite uneasy to explain here, please refer to the API. + - added : @chatwhisper, @chatnormal and @chatshout commands, which prevent from whispering, chatting normally or shouting respectively. It is different from @sendchat because they do not discard chat messages, they just transform a whisper to normal, normal to whisper, and shout to normal respectively. If all of these restrictions are active, the avatar can only whisper. This kind of command is useful in prisons where some prisoners like to shout all the time. + - added : @getstatusall command that acts exactly like a @getstatus, but will list all the restrictions the avatar is currently under, without of course disclosing which object issued which restriction. + - added : @attachall and @detachall commands, which work exactly like @attach (a folder) and @detach (a folder), but recursively. This means it will attach/detach whatever is inside a folder, and in its children as well. + - added : @getenv_...=nnnn command to get the current Windlight parameters. Works exactly like @setenv_...=force, with the same names. (1) +- Fixed a problem with wrong animation being played whenever @chatwhisper, @chatnormal or @chatshout are in force. +- Fixed a bug that would have crept up when RestrainedLofe is disabled in the viewer (which is impossible in Marine's viewer). +(1) This new feature cannot be backported to v1.19 viewers, since they don't implement the Windlight renderer. "@getenv_*" commands are therefore not implemented for v1.19 viewers and are ignored. + + +1.14c by Henri Beauchamp (equivalent to Marine's v1.14.2): +- Inclusion of Marine Kelley's changes: + - fixed : crashing when editing something beyond 1.5m, while being prevented from touching things over that distance. + - fixed : very odd behaviour when clicking on something while being prevented from touching things more than 1.5m away. + + +1.14b by Henri Beauchamp (equivalent to Marine's v1.14.1): +- Inclusion of Marine Kelley's changes: + - fixed : a bug that should have been fixed in 1.14, but was not tested. And when it's not tested, it's not working, says murphy's law. My bad. + - fixed : two Windlight control commands were not implemented in 1.14 (@setenv_sunglowfocus and @setenv_sunglowsize). Does not impact v1.19 viewers. + - fixed : can't detach an attachment when unable to edit (that's a bug introduced in 1.14). + + +1.14a by Henri Beauchamp (equivalent to Marine's v1.14): +- Inclusion of Marine Kelley's changes: + - added : WindLight control, so land owners (for instance) can control the way the visitors see their place, provided they use a RLV and a relay. This is a powerful feature meant for scripters, but not really BDSM-related. (1) + - fixed : a few small bugs, thanks Laylaa Magic and Crystals Galicia ! + - changed : if the sub is prevented from seeing location and their owner is sending a TP (2) offer but forgot to change the text (hence having "Join me in..."), the text will be hidden. +- fixed: a crash in v1.21 viewers when force-sat on login and the object is not yet rezzed. +- fixed: a bug (typo) in Marine's change (2) above. +- changed: the RestrainedLofeDebug flag now also toggles the log messages in RRInterface.cpp. +(1) This new feature cannot be fully backported to v1.19 viewers, since they don't implement the Windlight renderer. Only the "@setenv_daytime" setting is supported, the others are ignored. + + +1.13a by Henri Beauchamp (equivalent to Marine's v1.13.1): +- Inclusion of Marine Kelley's changes: + - added : new command @findfolder:=2222 to find a particular folder (it returns the full path of the first occurrence, in depth first). + - changed : the viewer can now handle sub-folders under the shared root (see API). Current scripts that are used to force wearing/unwearing shared outfits need to be modified in order to use that feature, though, otherwise they can only use the first level of folders. + - changed : shared folders can now be "disabled", which means they won't be seen by the viewer when forcing to attach, detach and getting a list. You can disable by adding a dot (".") at the beginning of the name of the folder. + - changed : now no-mod items see their parent folder being renamed differently : it becomes ".()" instead of " (attachpointname)". That way it won't be seen by the viewer anymore when getting the list (see above), and there is no risk of getting a comma (",") in their name anymore. Of course they still attach their no-mod contents like before. + + +1.12f by Henri Beauchamp (equivalent to Marine's v1.12.5): +- Inclusion of Marine Kelley's fix: + - fixed : crash (the viewer hangs, it doesn't crash to desktop) under certain circumstances while prevented from seeing the names of people around. + + +1.12e by Henri Beauchamp (equivalent to Marine's v1.12.4): +- Inclusion of Marine Kelley's fixes and new features: + - added : command "@getsitid=nnnn" to allow a script to know the UUID of the object we're sitting on. Useful only for scripters and not really a BDSM feature per se. But the viewer could get that information whereas the scripts couldn't, so here it is. Note : although it is a new feature, it is not important enough to justify changing the Minor Version of the viewer (1.13) + - added : the location and names are now hidden on the Abuse Report window when prevented from seeing location and names respectively, BUT the Abuse Report will be valid nonetheless (ie the Lindens will be able to read it clearly but not the sub) + - added : now unable to change the Busy automatic response when unable to send IMs. That can be used to set a humiliating message before preventing the sub from sending IMs, for instance *grins* (thanks Eggzist Boccaccio and Neelah Sivocci) + - added : owner messages are now hiding the region and parcel name when prevented from seeing the location (was done only on object IMs before) + - added : the URL to the Objects Sharing Tutorial on my blog is added to this notecard in the Shared Folders section above. + - changed : now unable to drag-select when unable to touch far objects (since you can't Edit-click on far objects either) + - changed : now unable to shift-drag an object in-world when unable to rez. + - changed : reinstate Attach To on the pie menu even when something is locked on you (of course trying to attach on an attachment point occupied by a locked item will silently fail). This allows a sub to carry things even when her inventory is locked away. + - changed : now the names are not clickable anymore while prevented from seeing names. + - changed : now the Active Speakers window showing who talked recently (both on chat and on voice) is hidden when prevented from seeing names. + - changed : now the names and locations are "censored" on any message except avatar chat when unable to see names and location respectively. This will defeat the usual radars (known issue : when someone is detected by a radar and not rezzed on the viewer yet, it won't be hidden) + - changed : now unable to drag things from the texture picker when unable to open inventory. + - changed : now unable to see scripted beacons when prevented from editing. + - changed : the viewer won't answer to @getstatus, @getoutfit etc RLV commands on channel 0. It was a way to mimic someone talking. + - changed : the viewer now *shouts* the automatic responses to @getstatus, @getoutfit etc RLV commands instead of just "saying" them. + - fixed : no-mod items sometimes wouldn't load automatically in the shared folders (thanks Diablo Payne) + - fixed (again) : now unable to send chat through emotes. It was already working before, then got broken for some reason (thanks Peyote Short) + - fixed : crash when giving empty coordinates to @tpto. +- Allow legit emotes (emotes without said text, and possibly truncated in length) in gestures when sendchat=n. + + +1.12d by Henri Beauchamp (equivalent to Marine's v1.12.3): +- Inclusion of Marine Kelley's fixes and new features: + - fixed : crash when saving a script in an object that is out of range + - fixed : double name in the IM panel when prevented from receiving IMs (but it introduces another bug : no name in the floating chat in this case) + - fixed : ironing out a way to cheat around @shownames (not an easy cheat this time) + - changed : owner of the land cannot fly even with admin options on + - changed : cannot change the inventory of an object we're sitting on when prevented from unsitting (thanks Mo Noel) + - changed (*): little particle twirls around an owned object do not show anymore (that brings some nice applications such as periodically checking the outfit of a sub) +(*) This feature has been implemented differently than in Marine's patch, so that the particles still appear for llOwnerSay() as long as it does not deal with RestrainedLofe commands (as this is quite useful to spot an object saying something to you). + + +1.12c by Henri Beauchamp (equivalent to Marine's v1.12.2): +- Inclusion of Marine Kelley's fixes and new features: + - added : new @fly command. + - added : the ability to share no-mod items, and also to Wear them when something is locked, provided the folder that contains them is properly named. See above. That one was long planned and is finally working ! + - fixed : removed the ability to use the pie menu on avatars when names are hidden. That means no direct interaction, but you can of course still reach people through Search etc. (thanks JiaDragon Allen) + - fixed : removed the ability to see the region name while it was hidden through an easy trick. (thanks Nilla Hax) + - fixed : snapshots would not force the HUDs to show if the checkbox was not checked first (but it would stay on afterwards). Now it is forced on whenever a HUD is locked. + - changed : separated the shownames restriction and the showloc restriction, to have one @shownames command. + - changed : added a couple more "dummy names" when the names are hidden. + + +1.12b by Henri Beauchamp (equivalent to Marine's v1.12.1): +- Inclusion of Marine Kelley's fixes and new features (but one): + - fixed : a couple of ways to cheat around location hiding. + - changed : when unable to see the current location, the names are hidden on the screen, on the tooltips, in the chat, in the edit window, and profiles cannot be opened directly (they still can in Search of course). + - changed : now unable to teleport a friend when unable to see the location. + - changed : improved touching far objects, it's more consistent now. +Note: the feature "now unable to fly when unable to teleport" was not implemented in the Cool SL Viewer, because it breaks the leashes of the collars (it becomes impossible for the sub to fly with their dom while leashed). I suggested to Marine to implement a new "@fly=n" command to take care of the fly restriction. + + +1.12a by Henri Beauchamp (equivalent to Marine's v1.12): +- Inclusion of Marine Kelley's fixes and new features: + - added : Force Teleport feature. The sub can be forced to teleport to any location, without asking for permission and without providing a Cancel button. Known issue : if the destination land has a telehub or a landing point, the sub will teleport there. + - added : No Show Location feature. The sub can be prevented from seeing in which region and parcel they currently are, teleported from, creating a landmark in, trying to buy etc. World Map is hidden too. This is still experimental, I have gone a long way to hide this information everywhere (even "censoring" system and object messages to hide the location), but there might still be places I have missed. I will not, however, "censor" Owner messages so radars can still overcome this restriction. + - changed : cannot Return/Delete/Take Copy/Unlink objects we are sitting on when we are prevented from unsitting or sit-tping. + - changed : cannot Open or Edit anything that is further than 1.5 m away when we are prevented from touching far objects. + - changed : cannot Open objects when we are unable to Edit. It might change later though. + - fixed : long item names would be renamed improperly by the viewer, now they are truncated before being renamed. + - fixed : @detach:china=force would detach whatever you wear on Chin instead of whatever is contained into the China shared folder. Thanks Mo Noel for seeing this. + +1.11h by Henri Beauchamp: +- Fixed a bug introduced by Marine in her 1.11.5.1 patch (spurious and excessive log lines issued when HUDs are attached, which lead to a slow down and huge log files). + + +1.11g by Henri Beauchamp (equivalent to Marine's v1.11.5.1): +- Inclusion of Marine Kelley's fixes: + - fixed : a weird crash when holding Alt while in Mouselook. + - changed : Hide HUDs in snapshots is now prevented only when a HUD is locked, not when just any attachment is locked. + - changed : Zoom out on the HUDs is now restricted only when a HUD is locked, not when just any attachment is locked. + + +1.11f by Henri Beauchamp (equivalent to Marine's v1.11.5): +- Inclusion of Marine Kelley's fixes: + - changed : cannot change the group tag if you are unable to send IMs anymore. + - changed : cannot Take and Return objects if you are unable to Rez things. + - changed : could not Delete objects when unable to Edit, now it is linked to Rez instead, since Rez is dedicated to build/remove objects while Edit is dedicated to modify existing content. + - fixed : bodyparts (shape, skin, eyes and hair) could not be shared. Keep in mind that bodyparts cannot be removed, only replaced by other bodyparts. + - fixed : a way to cheat through the "no edit" restriction (thanks Katie Paine !). + - fixed : "fartouch" was not preventing from clicking on objects that use the touch_end() LSL event (thanks Ibrew Meads !). + + +1.11e by Henri Beauchamp: +- Inclusion of Boy Lane's fix to a blocked IMs cosmetic bug. + + +1.11d by Henri Beauchamp: +- Inclusion of Boy Lane's fix to group IMs failing to be blocked. + + +1.11c by Henri Beauchamp (equivalent to Marine's v1.11.3): +- Inclusion of Marine Kelley's fix to v1.11 crash bugs at login time. + + +1.11b by Henri Beauchamp: +- Fixed the systematic camera zooming/paning bug when entering build mode. + + +1.11a by Henri Beauchamp (equivalent to Marine's v1.11.2): +- Inclusion of Marine Kelley's changes (from RestrainedLofe v1.11 to 1.11.2): + - added : a way to "share" inventory items. The user can now be forced to attach/detach objects and clothes by putting them in a folder contained in the root shared folder (for now named "#RLV"). + - added : when wearing a shared object, the name of the attachment point is added to its own for future use. It won't do that on non-shared items nor on no-modify items. + - added : fake Wear option if the object name contains the name of the target attachment point. + - added : force attach/wear and force detach/unwear by folder name (in the shared root only). + - added : list shared inventory with "@getinv=nnnn" command. + - added : always show HUD objects in snapshots when at least one object is locked. + - added : restrict show mini map and show world map (thanks Maike Short for the code). + - added : "@fartouch=n" command to restrict touch on objects farther than 1.5 meters away. + - fixed : a couple of loopholes including one discovered by Maike Short. + - known bugs : "bottom left" and "bottom right" HUD locations are going to "bottom", "top left" and "top right" to "top". + + +1.10i by Henri Beauchamp (this version has been used after a crash bug was found in v1.11a): +- Fixed the systematic camera zooming/paning bug when entering build mode. + + +1.10h by Henri Beauchamp: +- Inclusion of Marine Kelley's changes (from RestrainedLofe v1.10.5.2): + - changed : emotes crunched down to 20 characters instead of 30. + - fixed : a loophole discovered by Moss Hastings. Thanks Moss ! + + +1.10g by Henri Beauchamp: +- Inclusion of most (all but the fly interdiction) of Marine Kelley's changes (from RestrainedLofe v1.10.3 and v1.10.4): + - changed : Now when an object forces the user to sit on a furniture, it ignores its own @sittp=n restriction for the time of the command. This means that a Serious Shackles Collar which leash is active will still be able to force sit, regardless of the "@sittp=n" restriction issued by the *Leash plugin. It won't override the arms shackles leash, though (to prevent cheating). + - changed : Admin Commands is now rendered useless, as it was an easy way to cheat around certain restrictions. Thanks Anaxagoras McMillan for the bug report ! + - changed : Removed a potential cheat around the outfit restrictions. + - added : Can't delete objects you're sitting on (*). + - added : Can't edit objects someone is sitting on when sit-tp is prevented. +- Changed (*) so that this restriction only applies whenever you are prevented to unsit. + + +1.10f by Henri Beauchamp: +- When in RestrainedLofe mode, make sure it is impossible to use slurls to change the start location (always log in at the last location). + + +1.10e by Henri Beauchamp: +- Inclusion of Marine Kelley's changes (from RestrainedLofe v1.10.2): + - fixed : a bug with @edit and @viewnote. Thanks to those who pointed them out, they were really not easy to spot. + - added : @getstatus to let the script know what restrictions the avatar is submitted to. + + +1.10d by Henri Beauchamp: +- Fixes minor bugs in the client debug menu. + + +1.10c by Henri Beauchamp: +- Lift all restrictions in debug menu options as long as no item is locked. + + +1.10b by Henri Beauchamp: +- Inclusion of Marine Kelley's changes (from RestrainedLofe v1.10.1): + - fixed : @remoutfit=n didn't prevent from replacing clothes, unless @addoutfit=n was set + - fixed : could stand up with the pie menu and appearance even when prevented + - added : eyes, hair and shape for addoutfit and remoutfit +- Make sure the HUD zooming is not restricted as long as no RL object is locked. + + +1.10a by Henri Beauchamp: +- Inclusion of Marine Kelley's changes (from RestrainedLofe v1.10): + - changed: when the avatar is prevented from sending chat, using gestures no more produce "...". + - fixed : a couple of bugs about rez and edit that were still possible through some non-obvious options even when prevented. + - added : force sit on an object in-world, given its UUID. Thank you Shinji Lungu ! + - added : prevent standing up from the object you're sitting on. Also removes the "Stand Up" button. A VERY popular request. + - added : force unsit. Strangely seems to randomly fail. (*) + - added : prevent adding/removing clothes (all or selectively). + - added : force removing clothes (*) + - added : force detaching items (*) + - added : prevent reading notecards (doesn't close the already open ones and doesn't prevent from receiving them, for safety reasons). + - added : prevent opening inventory (closes all the inventory windows when activated). + - added : check clothes (gives the list of occupied layers, not the names of the clothes for privacy reasons). + - added : check attachments (gives the list of occupied attachment points, not the names of the items for privacy reasons). + - added : prevent sending messages on non-public chat channels, with exceptions. Doesn't prevent the "@version=nnnn" automatic reply. + - added : prevent customizing the TP invites when prevented from sending IMs. + - added : prevent reading the customized TP invites when prevented from reading IMs. + - added : ability for the viewer to execute several commands at the same time, separated by commas, only the first one beginning with '@'. + - added : "garbage collector" : when you unrez an item, all the restrictions attached to it are automatically lifted after a moment. + - added : commands are delayed until the avatar is fully operational when logging on, to avoid some "race conditions", typically when force-sitting on relog. + (*) Silently discarded if the user is prevented from doing so by the corresponding restriction. This is on purpose. + Ex : Force detach won't work if the object is undetachable. Force undress won't work if the user is prevented from undressing. +- Do not forbid debug features in menus when RestrainedLofe is not enabled. + + +1.05c by Henri Beauchamp: +- When in RestrainedLofe mode, make sure it is impossible (including by using the preferences menu or SLURLs), to change the start location (always login in the last location). + + +1.05b by Henri Beauchamp: +- Integrate the changes from Marine's v1.04: + - fixed Copy & Wear bug. It was working before, then stopped working. Works again. Thanks LXIX Tomorrow. + - now @recvim also prevents the user from receiving group chat. A VERY popular request. +- Prevent the use of the debug tool "Dump All Attachments" when the viewer is in RestrainedLofe mode. + + +1.05a by Henri Beauchamp: +- Gag bug fixed (all the text was suppressed in v1.03, preventing the toys to trigger their retorsion measures). +- The start location pull down menu is now suppressed altogether from the login screen when in RestrainedLofe mode. + + +1.04a: +- Fixes the bug in which @clear was clearing all the RestrainedLofe settings for all the attachments (instead of just for the calling attachment). + + +1.03: +- Manual @version checking in IM is now totally silent to the user so they never know when they're checked :) +- Slashed commands like "/ao off", "/hug X" on channel 0 allowed even when prevented from chatting (max 7 characters including '/') +- @edit and @rez viewer commands : to prevent Editing and Rezzing stuff respectively (useful for cages and very hard restraints) +- Can hear owner's attachments messages even when prevented from hearing chat. Cannot hear in-world objects nor other's attachments. +- Crash bug fixed in @clear commands. + + +1.02 by Henri Beauchamp: +- OOC bug fixed. +- Better algorithm for deciding whether an emote contains "spoken" text or not. +- Gagged text is now emitted as "..." to allow scripted gags to trigger their own retorsion measures. ;-P +- Emotes are no more truncated after the first period when @emote=add is in force. +- Commands are no more echoed to the main chat, unless RestrainedLofeDebug is set to TRUE. +- More bug fix and code cleanup. + + +1.01: +- Changed the way emotes are handled when prevented from chatting : now (( )) are authorized, signs like ()"*-_^= will discard the message, otherwise emotes are truncated to 30 chars (unless "@emote=add" command is issued, see below), and if a period is present whatever is after it is discarded +- Added "@emote=" to ignore the truncation when sending or hearing emotes in public chat +- Integrated Henri Beauchamp's fixes and additions (such as being able to switch all the features off after relog if needed). Thank you Henri ! +- Fixed modification of inventory of locked attachments, thank you for pointing that out Devious Lei ! +- Fixed text going through with chat bubbles (although emotes are totally erased, will be fixed later). Thank you for pointing that out Rylla Jewell ! + + +1.01a by Henri Beauchamp: +- Compiled within v1.18.5.1 for Linux. +- Most restrictions lifted when no locked item is worn. +- Made the viewer switchable (after a restart) between a normal viewer and a RestrainedLofe viewer. + + +1.0: +- Compiled under 1.18.4.3 for Windows +- Added No-teleport (Landmark, Location, Friend + Exceptions) +- Added No-Sit-TP over 1.5 meters away +- Added the patch and custom package source code +- Added the viewer API +- Removed ability to log in where you want => forced to My Last Location +- Removed ability to see in Wireframe as it could be used to cheat through blindfolds +- Fixed emotes going through No-receive-chat, now truncated + + +1.0b: +- Added No-send-chat, No-receive-chat, No-send-IM, No-receive-IM features. Exceptions can be specified to all these behaviours except No-send-chat, for instance to allow IM reception only from your keyholder. +- Added "@version=" so a script can expect the viewer to say its version on the specified channel. Useful for automated version checking. Thank you Amethyst Rosencrans for suggesting that solution ! + + +1.0a: +- First release. diff --git a/linden/indra/newview/app_settings/grids.xml b/linden/indra/newview/app_settings/grids.xml index ac46f68..aa5f8e5 100644 --- a/linden/indra/newview/app_settings/grids.xml +++ b/linden/indra/newview/app_settings/grids.xml @@ -12,91 +12,34 @@ login_pagehttp://secondlife.com/app/login/ - nameutil.osgrid.org - labelOSGrid - login_urihttp://osgrid.org:8002/ - helper_urihttp://osgrid.org/ - login_pagehttp://osgrid.org/loginscreen.php - - - nameutil.deepgrid.com - labelDeepGrid - login_urihttp://login.deepgrid.com:8002/ - helper_uri - - - nameutil.emerald.webhop.net - labelEmerald Network - login_urihttp://emerald.webhop.net:8002/ - helper_uri - - - nameutil.francogrid.org - labelFrancoGrid - login_urihttp://grid.francogrid.com:8002/ - helper_uri - - - nameutil.lemondededarwin.com - labelLe Monde de Darwin - login_urihttp://94.23.8.158:8002/ - helper_uri - - - nameeu-grid.org - labelEU-Grid - login_urihttp://eu-grid.org:8002/ + name2lifegrid.game-host.org + label2life Grid + login_urihttp://2lifegrid.game-host.org:8002/ helper_uri + login_pagehttp://2lifegrid.game-host.org/loginscreen.php - namegiantgrid.no-ip.biz - labelGiantGrid - login_urihttp://Gianttest.no-ip.biz:8002/ - helper_urihttp://gianttest.no-ip.biz/giantmap/ - login_pagehttp://gianttest.no-ip.biz/GiantMap/loginscreen.php - - - namenewworldgrid.com - labelThe New World Grid - login_urihttp://grid.newworldgrid.com:8002/ - helper_urihttp://account.newworldgrid.com/ - login_pagehttp://account.newworldgrid.com/loginscreen.php - - - name3rg.changeip.org + name3rdrockgrid.com label3rd Rock Grid login_urihttp://grid.3rdrockgrid.com:8002/ helper_urihttp://3rdrockgrid.com/main/rg_files/wr/ login_pagehttp://www.3rdrockgrid.com/startpage.php - namelegendcityonline.com - labelLegend City Online - login_urihttp://login.legendcityonline.com:8002/ - helper_urihttps://secure.legendcityonline.com/ - login_pagehttp://www.legendcityonline.com/welcome.php - - - nameuvatar.com - labelUvatar - login_urihttp://uvatar.com:8002/ - helper_uri - login_pagehttp://www.uvatar.com/welcome/ + nameavatarhangout.com + labelAvatar Hangout + login_urihttp://login.avatarhangout.com:8002/ + helper_urihttp://avatarhangout.com/ + login_pagehttp://www.avatarhangout.com/loginscreen.php - namegridsplash.com", - labelGrid Splash - login_urihttp://grid.gridsplash.com:8002/ + namecybergrid.de + labelCybergrid + login_urihttp://cybergrid.de:8002/ helper_uri + login_pagehttp://www.cybergrid.de/loginscreen.php - - namewsterra.com - labelWorld Sim Terra - login_urihttp://wsterra.com:8002/ - helper_urihttp://wsterra.com/ - login_pagehttp://wsterra.com/log.php - - + namecyberlandia.net labelCyberlandia login_urihttp://grid.cyberlandia.net:8002/ @@ -104,31 +47,18 @@ login_pagehttp://www.cyberlandia.net/loginscreen.php - nametribalnet.se - labelTribal Net - login_urihttp://login.tribalnet.se/ - helper_uri - - - namehypergrid.org - labelMetropolis - login_urihttp://hypergrid.org:8002/ - helper_urihttp://metropolis.hypergrid.org/oswi.php - login_pagehttp://metropolis.hypergrid.org/ - - - nameaugrid.org - labelAUGrid - login_urihttp://augrid.org:8002/ - helper_urihttp://augrid.org/ - login_pagehttp://augrid.org/loginscreen.php - + nameemeraldnetwork.com + labelEmerald Network + login_urihttp://emeraldnetwork.webhop.net:8002/ + helper_urihttp://www.emeraldnetwork.com/ + login_page + - nameavatarhangout.com - labelAvatar Hangout - login_urihttp://login.avatarhangout.com:8002/ - helper_urihttp://avatarhangout.com/ - login_pagehttp://www.avatarhangout.com/loginscreen.php + namefrancogrid.com + labelFrancoGrid + login_urihttp://grid.francogrid.com:8002/ + helper_uri + login_pagehttp://www.francogrid.com/client.php namegermangrid.eu @@ -138,56 +68,39 @@ login_pagehttp://germangrid.eu/loginscreen.php - namedgpgrid.selfip.org - labelDGP Grid - login_urihttp://dgpgrid.selfip.org:8002/ - helper_uri - - - namelifesim.com.br - labelLifeSim - login_urihttp://216.40.235.66:8002/ - helper_urihttp://www.lifesim.com.br/ - - - namefw-estates.com - labelFantasy World Estates - login_urihttp://maingrid.fw-estates.com:8002/ - helper_urihttp://grid006.fw-estates.com/ + namegiantgrid.no-ip.biz + labelGiantGrid + login_urihttp://Gianttest.no-ip.biz:8002/ + helper_urihttp://gianttest.no-ip.biz/giantmap/ + login_pagehttp://gianttest.no-ip.biz/GiantMap/loginscreen.php - namermhdesignestate.com - labelRMH Design Estate - login_urihttp://maingrid.rmhdesignestate.com:8002/ - helper_urihttp://grid006.rmhdesignestate.com/ + namegrid4us.net + labelGrid4Us + login_urihttp://grid4us.net:8002/ + helper_urihttp://grid4us.net/ + login_pagehttp://grid4us.net/login.php - namegsquared.info - labelReactionGrid - login_urihttp://gsquared.info:8008/ - helper_uri - login_pagehttp://gsquared.info/portal/ + nameinworldz.com + labelInworldz + login_urihttp://inworldz.com:8002/ + helper_urihttp://inworldz.com/ + login_pagehttp://inworldz.com/loginscreen.php - nameafuturelife.com - labelA Future Life - login_urihttp://66.240.233.142/ + namemeta7.com + labelMeta7 + login_urihttp://sim-linuxmain.org:8002/ helper_uri - login_pagehttp://www.afuturelife.com/ + login_pagehttp://api.meta7.com/loginscreen.php - namepseudospace.net - labelPseudospace - login_urihttp://grid.pseudospace.net:8002/ - helper_urihttp://www.pseudospace.net/ - login_pagehttp://www.pseudospace.net/loginscreen.php - - - nameyourgrid.de - labelYourGrid - login_urihttp://yourgrid.de:8002/ - helper_uri - login_pagehttp://yourgrid.de/interface/loginscreen.php + namehypergrid.org + labelMetropolis + login_urihttp://hypergrid.org:8002/ + helper_urihttp://metropolis.hypergrid.org/oswi.php + login_pagehttp://metropolis.hypergrid.org/ namemyopengrid.com @@ -196,27 +109,6 @@ helper_urihttp://www.myopengrid.com/ login_pagehttp://www.myopengrid.com/loginscreen.php - - namephoenix-community.net - labelPhoenixSim - login_urihttp://ps.phoenix-community.net:8002/ - helper_urihttp://ps.phoenix-community.net/os/ - login_pagehttp://ps.phoenix-community.net/os/loginscreen.php - - - namevirtualsims.net - labelVirtual Sims - login_urihttp://virtualsims.net:8002/ - helper_urihttp://66.71.246.212/ - login_pagehttp://virtualsims.net/ - - - namegrid4us.net - labelGrid4Us - login_urihttp://grid4us.net:8002/ - helper_urihttp://grid4us.net/ - login_pagehttp://grid4us.net/login.php - nameos.taf-jp.com labelOpenKansai @@ -225,24 +117,39 @@ login_pagehttp://os.taf-jp.com/ - name2lifegrid.game-host.org - labelSchweiz - login_urihttp://2lifegrid.game-host.org:8002/ - helper_uri - login_pagehttp://2lifegrid.game-host.org/loginscreen.php + nameopen-neuland.talentraspel.de + labelOpen Neuland + login_uri http://login-on.talentraspel.de:8002/ + helper_urihttp://grid-on.talentraspel.de + login_pagehttp://grid-on.talentraspel.de/portal/welcome.php + + + nameutil.osgrid.org + labelOSGrid + login_urihttp://osgrid.org:8002/ + helper_urihttp://osgrid.org/ + login_pagehttp://osgrid.org/loginscreen.php - namedreamlandgrid.com - labelDreamland Grid - login_urihttp://dreamlandgrid.com:8002/ + namepseudospace.net + labelPseudospace + login_urihttp://grid.pseudospace.net:8002/ + helper_urihttp://www.pseudospace.net/ + login_pagehttp://www.pseudospace.net/loginscreen.php + + + namegsquared.info + labelReactionGrid + login_urihttp://gsquared.info:8008/ helper_uri - login_pagehttp://www.dreamlandgrid.com/opensimwi/loginscreen.php + login_pagehttp://gsquared.info/portal/ - nametiog.ath.cx - labelYour Alternative Life - login_urihttp://tiog.ath.cx:8002/ - helper_urihttp://grid01.from-ne.com/tios/services/ + nameroleplayworlds.net + labelRoleplay Worlds + login_urihttp://grid.roleplayworlds.net:8002/ + helper_urihttp:/grid.roleplayworlds.net/ + login_pagehttp://grid.roleplayworlds.net/loginscreen.php namesciencesim.com @@ -251,39 +158,90 @@ helper_urihttp://sciencesim.com/scisim/ login_pagehttp://sciencesim.com/scisim/loginscreen.php + + namesegarraopengrid.com + labelSegarra + login_urihttp://segarragrid.com:8002/ + helper_urihttp://segarragrid.com/ + login_pagehttp://segarraopengrid.com/visit-our-grid + + + nametertiarygrid.com + labelTertiary + login_urihttp://tertiarygrid.com:8002/ + helper_urihttp://tertiarygrid.com/osgwi/ + login_pagehttp://tertiarygrid.com/launch.php + + + namenewworldgrid.com + labelThe New World Grid + login_urihttp://grid.newworldgrid.com:8002/ + helper_urihttp://account.newworldgrid.com/ + login_pagehttp://account.newworldgrid.com/loginscreen.php + + nametwistedsky.net + labelTwisted Sky + login_urihttp://twistedsky.net:8002/ + helper_urihttp://twistedsky.net:9000/ + login_pagehttp://twistedsky.net/opensimwi/loginscreen.php + + nameunica.it labelUnica login_urihttp://grid.unica.it:9000/ helper_uri login_pagehttp://grid.unica.it/loginscreen.php - - namethegorgrid.com - labelThe Gor Grid - login_urihttp://thegorgrid.com:8002/ - helper_urihttp://thegorgrid.com/ - login_pagehttp://thegorgrid.com/loginscreen.php + + nameuvatar.com + labelUvatar + login_urihttp://uvatar.com:8002/ + helper_uri + login_pagehttp://www.uvatar.com/welcome/ + + + namev-business.com + labelv-Business + login_urihttp://grid.v-business.com:8002/ + helper_urihttp://v-business.com + login_pagehttp://grid.v-business.com/opensimwi/loginscreen.php + + + namewilder-westen.talentraspel.de + labelWilder Westen + login_uri http://login-ww.talentraspel.de:8002/ + helper_urihttp://grid-ww.talentraspel.de + login_pagehttp://grid-ww.talentraspel.de/portal/welcome.php - namesim-linuxmain.org - labelCuon Grid - login_urihttp://sim-linuxmain.org:8002/ - helper_uri + namewsterra.com + labelWorldSim Terra + login_urihttp://wsterra.com:8002/ + helper_urihttp://wsterra.com/ + login_pagehttp://wsterra.com/log.php - nameartgridonline.com - labelArtgridOnLine - login_urihttp://artgridonline.com:8002/ - helper_uri - login_pagehttp://artgridonline.com/opensim/loginscreen.php + namegrid01.from-ne.com + labelYour Alternative Life + login_urihttp://grid01.from-ne.com:8002/ + helper_urihttp://grid01.from-ne.com/tios/services/ + login_pagehttp://grid01.from-ne.com/tios/loginscreen3.php namelocalhost - labelLocal + labelLocal port 8002 login_urihttp://127.0.0.1:8002/ helper_urihttp://127.0.0.1/ + login_page + + namelocalhost9000 + labelLocal port 9000 + login_urihttp://127.0.0.1:9000/ + helper_urihttp://127.0.0.1/ + login_page + diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml index 7b178d6..5ec7617 100644 --- a/linden/indra/newview/app_settings/settings.xml +++ b/linden/indra/newview/app_settings/settings.xml @@ -23,22 +23,6 @@ Value 1 - UserChatColor - - Comment - Color of your chat messages - Persist - 1 - Type - Color4 - Value - - 1.0 - 1.0 - 1.0 - 1.0 - - AgentChatColor Comment @@ -77,6 +61,17 @@ Value 1 + AllowMUpose + + Comment + Allow MU* pose style in chat and IM (with ':' as a synonymous to '/me ') + Persist + 1 + Type + Boolean + Value + 1 + AllowTapTapHoldRun Comment @@ -330,6 +325,17 @@ Value 0 + AutoCloseOOC + + Comment + Auto-close OOC chat (i.e. add \"))\" if not found and \"((\" was used) + Persist + 1 + Type + Boolean + Value + 1 + AutoLeveling Comment @@ -1125,7 +1131,7 @@ Type Boolean Value - 0 + 1 ChatOnlineNotification @@ -1160,29 +1166,6 @@ Value 1 - AllowMUpose - - Comment - Allow MU* pose style in chat and IM (with ':' as a synonymous to '/me ') - Persist - 1 - Type - Boolean - Value - 1 - - ChatVisible - AutoCloseOOC - - Comment - Auto-close OOC chat (i.e. add \"))\" if not found and \"((\" was used) - Persist - 1 - Type - Boolean - Value - 1 - ChatVisible Comment @@ -1892,7 +1875,7 @@ Type F32 Value - 0.700 + 0.400 ConsoleBufferSize @@ -1916,17 +1899,6 @@ Value 40 - ContactsTornOff - - Comment - Show contacts window separately from Communicate window. - Persist - 1 - Type - Boolean - Value - 0 - CookiesEnabled Comment @@ -2114,6 +2086,17 @@ Value 1 + DisableMessagesSpacing + + Comment + Set to TRUE to disable messages spacing in chat console + Persist + 1 + Type + Boolean + Value + 1 + DisableRendering Comment @@ -2266,7 +2249,7 @@ Type Boolean Value - 0 + 1 DragAndDropToolTipDelay @@ -2372,6 +2355,105 @@ 1.0 + EmeraldBoobMass + + Comment + Mass of boobs. + Persist + 1 + Type + F32 + Value + 74.0 + + EmeraldBoobHardness + + Comment + Hardness (dampening) of boobs. + Persist + 1 + Type + F32 + Value + 51 + + EmeraldBreastPhysicsToggle + + Comment + Enables/Disables breast physics + Persist + 1 + Type + Boolean + Value + 1 + + EmeraldBreastSportsBra + + Comment + allows disabling the physics for 1 av, in case their outfit looks wrong with it on + Persist + 1 + Type + Boolean + Value + 0 + + EmeraldBoobVelMax + + Comment + Max amount of velocity boobs can have + Persist + 1 + Type + F32 + Value + 74 + + EmeraldBoobFriction + + Comment + Internal friction (brings boobs to rest). Shouldn't ever be above 1. + Persist + 1 + Type + F32 + Value + 80 + + EmeraldBoobVelMin + + Comment + Friction Fraction of FPS (used to keep friction uniform through FPS change). + Persist + 1 + Type + F32 + Value + 14 + + EmeraldBoobXYInfluence + + Comment + Amount of influence along the X and Y planes. + Persist + 1 + Type + F32 + Value + 0.1 + + EmeraldTemporaryUpload + + Comment + Whether or not a upload is temp + Persist + 0 + Type + Boolean + Value + 0 + EnableRippleWater Comment @@ -2427,17 +2509,17 @@ Value 175 - FPSLogFrequency + FetchInventoryOnLogin Comment - Seconds between display of FPS in log (0 for never) + Automatically fetch the inventory in the background after login Persist 1 Type - F32 + Boolean Value - 60.0 - + 1 + FilterItemsPerFrame Comment @@ -2537,17 +2619,6 @@ Value 0 - PrivateLookAt - - Comment - When TRUE, do not disclose what we are looking at - Persist - 1 - Type - Boolean - Value - 0 - FirstPersonBtnState Comment @@ -2581,72 +2652,6 @@ Value 0 - LongDateFormat - - Comment - Long date format to use - Persist - 1 - Type - String - Value - %A %d %B %Y - - ShortDateFormat - - Comment - Short date format to use - Persist - 1 - Type - String - Value - %Y-%m-%d - - ShortTimeFormat - - Comment - Short time format (hours and minutes) to use - Persist - 1 - Type - String - Value - %H:%M - - LongTimeFormat - - Comment - Long time format (hours, minutes and seconds) to use - Persist - 1 - Type - String - Value - %H:%M:%S - - TimestampFormat - - Comment - Timestamp format to use - Persist - 1 - Type - String - Value - %a %d %b %Y %H:%M:%S - - SecondsInChatAndIMs - - Comment - TRUE to add seconds to timestamps for IM and chat - Persist - 1 - Type - Boolean - Value - 0 - FloaterAboutRect Comment @@ -2973,6 +2978,22 @@ 0 + FloaterGroupsRect + + Comment + Rectangle for groups window" + Persist + 1 + Type + Rect + Value + + 0 + 300 + 275 + 0 + + FloaterGestureRect2 Comment @@ -3083,8 +3104,8 @@ Value 0 - 0 - 0 + 25 + 400 0 @@ -3120,136 +3141,10 @@ 0 - ShowRadar + FloaterLandRect5 Comment - Show the radar floater - Persist - 1 - Type - Boolean - Value - 0 - - FloaterRadarRect - - Comment - Rectangle for Radar - Persist - 1 - Type - Rect - Value - - 0 - 400 - 200 - 0 - - - RadarKeepOpen - - Comment - Keeps radar updates running in background - Persist - 1 - Type - Boolean - Value - 0 - - RadarUpdateRate - - Comment - Radar update rate (0 = high, 1 = medium, 2 = low) - Persist - 1 - Type - U32 - Value - 1 - - RadarAlertSim - - Comment - Whether the radar emits chat alerts for avatars entering/exiting sim - Persist - 1 - Type - Boolean - Value - 0 - - RadarAlertDraw - - Comment - Whether the radar emits chat alerts for avatars entering/exiting draw distance - Persist - 1 - Type - Boolean - Value - 0 - - RadarAlertShoutRange - - Comment - Whether the radar emits chat alerts for avatars entering/exiting shout range - Persist - 1 - Type - Boolean - Value - 0 - - RadarAlertChatRange - - Comment - Whether the radar emits chat alerts for avatars entering/exiting chat range - Persist - 1 - Type - Boolean - Value - 1 - - RadarChatAlerts - - Comment - Whether the radar emits chat alerts regarding the status of avatars it displays - Persist - 1 - Type - Boolean - Value - 0 - - RadarChatKeys - - Comment - Enable private chat alerts for avatars entering the region - Persist - 1 - Type - Boolean - Value - 0 - - RadarChatKeysChannel - - Comment - Private channel used to broadcast the key of incoming avatars - Persist - 1 - Type - S32 - Value - -8888888 - - FloaterLandRect5 - - Comment - Rectangle for About Land window + Rectangle for About Land window Persist 1 Type @@ -3374,6 +3269,22 @@ 0 + FloaterRadarRect + + Comment + Rectangle for Radar + Persist + 1 + Type + Rect + Value + + 0 + 400 + 200 + 0 + + FloaterRegionInfo Comment @@ -3901,6 +3812,17 @@ 29 + FPSLogFrequency + + Comment + Seconds between display of FPS in log (0 for never) + Persist + 1 + Type + F32 + Value + 60.0 + FreezeTime Comment @@ -4066,26 +3988,21 @@ Value 400 - HTMLLinkColor + HelpHomeURL Comment - Color of hyperlinks + URL of initial help page Persist 1 Type - Color4 + String Value - - 0.600000023842 - 0.600000023842 - 1.0 - 1.0 - + help/index.html - HelpHomeURL + HelpLastVisitedURL Comment - URL of initial help page + URL of last help page, will be shown next time help is accessed Persist 1 Type @@ -4093,16 +4010,38 @@ Value help/index.html - HelpLastVisitedURL + HideIMInChat Comment - URL of last help page, will be shown next time help is accessed + Hide IM in chat console Persist 1 Type - String + Boolean Value - help/index.html + 0 + + HideMasterRemote + + Comment + Hide the Master Remote control when useless + Persist + 1 + Type + Boolean + Value + 1 + + HideNotificationsInChat + + Comment + Do not echo/log notifications in chat + Persist + 1 + Type + Boolean + Value + 0 HighResSnapshot @@ -4158,6 +4097,22 @@ 128 + HTMLLinkColor + + Comment + Color of hyperlinks + Persist + 1 + Type + Color4 + Value + + 0.600000023842 + 0.600000023842 + 1.0 + 1.0 + + HtmlReleaseMessage Comment @@ -4190,28 +4145,6 @@ 1.0 - HideNotificationsInChat - - Comment - Do not echo/log notifications in chat - Persist - 1 - Type - Boolean - Value - 0 - - HideIMInChat - - Comment - Hide IM in chat console - Persist - 1 - Type - Boolean - Value - 0 - IMInChatHistory Comment @@ -4267,29 +4200,18 @@ Value 0.0 - InstallLanguage - - Comment - Language passed from installer (for UI) - Persist - 1 - Type - String - Value - default - - FetchInventoryOnLogin - - Comment - Automatically fetch the inventory in the background after login - Persist - 1 - Type - Boolean - Value - 1 - - InventoryAutoOpenDelay + InstallLanguage + + Comment + Language passed from installer (for UI) + Persist + 1 + Type + String + Value + default + + InventoryAutoOpenDelay Comment Seconds before automatically opening inventory when mouse is over inventory button when performing inventory drag and drop @@ -4465,55 +4387,6 @@ Value 1 - LCDDestination - - Comment - Which LCD to use - Persist - 1 - Type - S32 - Value - 0 - - LSLFindCaseInsensitivity - - Comment - Use case insensitivity when searching in LSL editor - Persist - 1 - Type - Boolean - Value - 0 - - LSLHelpRect - - Comment - Rectangle for LSL help window - Persist - 1 - Type - Rect - Value - - 0 - 400 - 400 - 0 - - - LSLHelpURL - - Comment - URL that points to LSL help files, with [LSL_STRING] corresponding to the referenced LSL function or keyword - Persist - 1 - Type - String - Value - http://wiki.secondlife.com/wiki/[LSL_STRING] - LagMeterShrunk Comment @@ -4602,7 +4475,6 @@ Value 0.0.0 - LastSnapshotToEmailHeight Comment @@ -4680,6 +4552,17 @@ Value 0 + LCDDestination + + Comment + Which LCD to use + Persist + 1 + Type + S32 + Value + 0 + LeftClickShowMenu Comment @@ -4834,6 +4717,28 @@ Value + LongDateFormat + + Comment + Long date format to use + Persist + 1 + Type + String + Value + %A %d %B %Y + + LongTimeFormat + + Comment + Long time format (hours, minutes and seconds) to use + Persist + 1 + Type + String + Value + %H:%M:%S + LosslessJ2CUpload Comment @@ -4845,6 +4750,44 @@ Value 0 + LSLFindCaseInsensitivity + + Comment + Use case insensitivity when searching in LSL editor + Persist + 1 + Type + Boolean + Value + 0 + + LSLHelpRect + + Comment + Rectangle for LSL help window + Persist + 1 + Type + Rect + Value + + 0 + 400 + 400 + 0 + + + LSLHelpURL + + Comment + URL that points to LSL help files, with [LSL_STRING] corresponding to the referenced LSL function or keyword + Persist + 1 + Type + String + Value + http://wiki.secondlife.com/wiki/[LSL_STRING] + MainloopTimeoutDefault Comment @@ -5744,6 +5687,17 @@ Value 13 + PreviewAnimInWorld + + Comment + Play animation preview in-world when uploading + Persist + 1 + Type + Boolean + Value + 1 + PreviewAnimRect Comment @@ -5840,17 +5794,6 @@ 0 - SaveScriptsAsMono - - Comment - When set to TRUE, save scripts in inventory as Mono scripts instead of LSL2 - Persist - 1 - Type - Boolean - Value - 1 - PreviewSoundRect Comment @@ -5915,6 +5858,17 @@ 0 + PrivateLookAt + + Comment + When TRUE, do not disclose what we are looking at + Persist + 1 + Type + Boolean + Value + 0 + ProbeHardwareOnStartup Comment @@ -6011,13 +5965,112 @@ QuitAfterSeconds Comment - The duration allowed before quitting. + The duration allowed before quitting. + Persist + 1 + Type + F32 + Value + 0.0 + + RadarAlertSim + + Comment + Whether the radar emits chat alerts for avatars entering/exiting sim + Persist + 1 + Type + Boolean + Value + 0 + + RadarAlertDraw + + Comment + Whether the radar emits chat alerts for avatars entering/exiting draw distance + Persist + 1 + Type + Boolean + Value + 0 + + RadarAlertShoutRange + + Comment + Whether the radar emits chat alerts for avatars entering/exiting shout range + Persist + 1 + Type + Boolean + Value + 0 + + RadarAlertChatRange + + Comment + Whether the radar emits chat alerts for avatars entering/exiting chat range + Persist + 1 + Type + Boolean + Value + 1 + + RadarChatAlerts + + Comment + Whether the radar emits chat alerts regarding the status of avatars it displays + Persist + 1 + Type + Boolean + Value + 0 + + RadarChatKeys + + Comment + Enable private chat alerts for avatars entering the region + Persist + 1 + Type + Boolean + Value + 0 + + RadarChatKeysChannel + + Comment + Private channel used to broadcast the key of incoming avatars + Persist + 1 + Type + S32 + Value + -8888888 + + RadarKeepOpen + + Comment + Keeps radar updates running in background + Persist + 1 + Type + Boolean + Value + 0 + + RadarUpdateRate + + Comment + Radar update rate (0 = high, 1 = medium, 2 = low) Persist 1 Type - F32 + U32 Value - 0.0 + 1 RadioLandBrushAction @@ -6918,6 +6971,72 @@ Value 0 + RestrainedLove + + Comment + Toggles the RestrainedLove features (BDSM lockable toys support). Needs a restart of the viewer. + Persist + 1 + Type + Boolean + Value + 0 + + RestrainedLoveDebug + + Comment + Toggles the RestrainedLove debug mode (displays the commands when in debug mode). + Persist + 1 + Type + Boolean + Value + 0 + + RestrainedLoveNoSetEnv + + Comment + When TRUE, forbids to set the environment (time of day and Windlight settings) via RestrainedLove. Needs a restart of the viewer. + Persist + 1 + Type + Boolean + Value + 0 + + RestrainedLoveForbidGiveToRLV + + Comment + When TRUE, forbids to give sub-folders to the #RLV RestrainedLove folder. + Persist + 1 + Type + Boolean + Value + 0 + + RestrainedLoveAllowWear + + Comment + When TRUE, enables the Wear command in the inventory context menus (unless @defaultwear is in force). + Persist + 1 + Type + Boolean + Value + 0 + + RezWithLandGroup + + Comment + Rez objects with land group when possible + Persist + 1 + Type + Boolean + Value + 0 + RotateRight Comment @@ -6973,6 +7092,17 @@ Value 0 + SavedRenderFarClip + + Comment + Saved draw distance (used in case of logout during speed rezzing) + Persist + 1 + Type + F32 + Value + 0.0 + SaveMinidump Comment @@ -6982,6 +7112,17 @@ Type Boolean Value + 0 + + SaveScriptsAsMono + + Comment + When set to TRUE, save scripts in inventory as Mono scripts instead of LSL2 + Persist + 1 + Type + Boolean + Value 1 ScaleShowAxes @@ -7088,6 +7229,17 @@ Value lang=[LANG]&mat=[MATURITY]&t=[TEEN]&region=[REGION]&x=[X]&y=[Y]&z=[Z]&session=[SESSION] + SecondsInChatAndIMs + + Comment + TRUE to add seconds to timestamps for IM and chat + Persist + 1 + Type + Boolean + Value + 0 + SelectMovableOnly Comment @@ -7198,6 +7350,28 @@ Value 0 + ShortDateFormat + + Comment + Short date format to use + Persist + 1 + Type + String + Value + %Y-%m-%d + + ShortTimeFormat + + Comment + Short time format (hours and minutes) to use + Persist + 1 + Type + String + Value + %H:%M + ShowActiveSpeakers Comment @@ -7576,21 +7750,54 @@ Value 0 - ShowMiniMap + ShowAudioVolume Comment - Display mini map on login + Persist - 1 + 0 Type Boolean Value 0 - UseOldTrackingDots + ShowFriends Comment - Use old T-like tracking dots in mini-map (takes effect after viewer restart) + + Persist + 0 + Type + Boolean + Value + 0 + + ShowGroups + + Comment + + Persist + 0 + Type + Boolean + Value + 0 + + ShowGroupsButton + + Comment + Show the Groups button in the toolbar (requires a restart) + Persist + 1 + Type + Boolean + Value + 1 + + ShowMiniMap + + Comment + Display mini map on login Persist 1 Type @@ -7697,6 +7904,17 @@ Value 0 + ShowRadar + + Comment + Show the radar floater + Persist + 1 + Type + Boolean + Value + 0 + ShowSearchBar Comment @@ -8061,6 +8279,28 @@ 1.0 + SpeedRez + + Comment + Set to TRUE to increase rezzing speed via draw distance stepping + Persist + 1 + Type + Boolean + Value + 1 + + SpeedRezInterval + + Comment + Interval in seconds between each draw distance increment + Persist + 1 + Type + U32 + Value + 12 + SpeedTest Comment @@ -8302,6 +8542,17 @@ Value 1000.0 + TimestampFormat + + Comment + Timestamp format to use + Persist + 1 + Type + String + Value + %a %d %b %Y %H:%M:%S + ToolHelpRect Comment @@ -8441,7 +8692,7 @@ Type Boolean Value - 1 + 0 UIFloaterTestBool @@ -9169,6 +9420,17 @@ Value 6e1a3980-bf2d-4274-8970-91e60d85fb52 + UIImgDefaultAlphaUUID + + Comment + + Persist + 0 + Type + String + Value + 5748decc-f629-461c-9a36-a35a221fe21f + UIImgDefaultEyesUUID Comment @@ -9268,6 +9530,17 @@ Value 5748decc-f629-461c-9a36-a35a221fe21f + UIImgDefaultTattooUUID + + Comment + + Persist + 0 + Type + String + Value + 5748decc-f629-461c-9a36-a35a221fe21f + UIImgDefaultUnderwearUUID Comment @@ -9961,6 +10234,55 @@ 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 + + UseOldTrackingDots + + Comment + Use old T-like tracking dots in mini-map (takes effect after viewer restart) + Persist + 1 + Type + Boolean + Value + 0 + + UserChatColor + + Comment + Color of your chat messages + Persist + 1 + Type + Color4 + Value + + 1.0 + 1.0 + 1.0 + 1.0 + + UseStartScreen Comment diff --git a/linden/indra/newview/emeraldboobutils.cpp b/linden/indra/newview/emeraldboobutils.cpp new file mode 100644 index 0000000..6d12389 --- /dev/null +++ b/linden/indra/newview/emeraldboobutils.cpp @@ -0,0 +1,189 @@ +#include "llviewerprecompiledheaders.h" +#include "emeraldboobutils.h" + +std::ostream &operator<<(std::ostream &os, const EmeraldGlobalBoobConfig &v) +{ + os << "EmeraldBoobConfig" << std::endl; + os << "enabled: " << v.enabled << std::endl; + os << "mass: " << v.mass << std::endl; + os << "hardness: " << v.hardness << std::endl; + os << "zMax: " << v.zMax << std::endl; + os << "velMin: " << v.velMin << std::endl; + os << "velMax: " << v.velMax << std::endl; + os << "zInfluence: " << v.zInfluence << std::endl; + os << "friction: " << v.friction << std::endl; + return os; +} + +std::ostream &operator<<(std::ostream &os, const EmeraldAvatarLocalBoobConfig &v) +{ + os << "EmeraldAvatarLocalBoobConfig" << std::endl; + os << "actualBoobGrav: " << v.actualBoobGrav << std::endl; + os << "boobSize: " << v.boobSize << std::endl; + return os; +} + +std::ostream &operator<<(std::ostream &os, const EmeraldBoobState &v) +{ + os << "EmeraldBoobState" << std::endl; + os << "boobGrav: " << v.boobGrav << std::endl; + os << "chestPosition: " << v.chestPosition << std::endl; + os << "chestRotation: " << v.chestRotation << std::endl; + os << "elapsedTime: " << v.elapsedTime << std::endl; + os << "frameDuration: " << v.frameDuration << std::endl; + os << "chestDisplacement: " << v.chestDisplacement << std::endl; + os << "localChestDisplacement: " << v.localChestDisplacement << std::endl; + os << "displacementForce: " << v.displacementForce << std::endl; + os << "mysteryValue: " << v.mysteryValue << std::endl; + os << "Number of bounceStates: " << v.bounceStates.size() << std::endl; + return os; +} + +std::ostream &operator<<(std::ostream &os, const EmeraldBoobInputs &v) +{ + os << "EmeraldBoobInputs" << std::endl; + os << "chestPosition: " << v.chestPosition << std::endl; + os << "chestRotation: " << v.chestRotation << std::endl; + os << "elapsedTime: " << v.elapsedTime << std::endl; + os << "appearanceFlag: " << v.appearanceFlag << std::endl; + os << "appearanceAnimating: " << v.appearanceAnimating << std::endl; + return os; +} + +std::ostream &operator<<(std::ostream &os, const EmeraldBoobBounceState &v) +{ + os << "EmeraldBoobBounceState" << std::endl; + os << "bounceStart: " << v.bounceStart << std::endl; + os << "bounceStartAmplitude: " << v.bounceStartAmplitude << std::endl; + os << "bounceStartFrameDuration: " << v.bounceStartFrameDuration << std::endl; + return os; +} + +F32 EmeraldBoobUtils::convertMass(F32 displayMass) +{ return displayMass/100.f*150.f; }; + +F32 EmeraldBoobUtils::convertHardness(F32 displayHardness) +{ return displayHardness/100.f*50; }; + +F32 EmeraldBoobUtils::convertVelMax(F32 displayVelMax) +{ return displayVelMax/100.f*0.01f; }; + +F32 EmeraldBoobUtils::convertFriction(F32 displayFriction) +{ return displayFriction/100.f*1.0f; }; + +F32 EmeraldBoobUtils::convertVelMin(F32 displayVelMin) +{ return displayVelMin/100.f; }; + +EmeraldBoobState EmeraldBoobUtils::idleUpdate(const EmeraldGlobalBoobConfig &config, const EmeraldAvatarLocalBoobConfig &localConfig, const EmeraldBoobState &oldState, const EmeraldBoobInputs &inputs) +{ + EmeraldBoobState newState; + F32 avatarLocalMass = 0.0f; + F32 partMod = 1.f; + + if(!config.enabled || inputs.appearanceFlag || inputs.appearanceAnimating) + return newState; + + if(inputs.type == 0) + { + newState.boobGrav = localConfig.actualBoobGrav; + avatarLocalMass = (llclamp(localConfig.boobSize, 0.0f, 0.5f) / 0.5f); + } + if(inputs.type == 1) + { + newState.boobGrav = localConfig.actualButtGrav; + partMod = 1.5f; + avatarLocalMass = llclamp(localConfig.actualButtGrav, 0.0f, 0.5f) / 0.5f; + } + if(inputs.type == 2) + { + newState.boobGrav = localConfig.actualFatGrav; + partMod = 1.3f; + avatarLocalMass = localConfig.actualFatGrav; + } + + + newState.elapsedTime = inputs.elapsedTime; + // seemed to create incorrect amounts of velocity when FPS varied + newState.frameDuration = inputs.elapsedTime - oldState.elapsedTime; + newState.chestPosition = inputs.chestPosition; + newState.chestRotation = inputs.chestRotation; + newState.chestDisplacement = inputs.chestPosition - oldState.chestPosition; + newState.localChestDisplacement = newState.chestDisplacement * ~inputs.chestRotation; + + + std::list bounceStates = oldState.bounceStates; + + if(fabs(newState.localChestDisplacement.length()) > 0.f) + { + F32 boobVel = 0.f; + boobVel = newState.localChestDisplacement.mV[VZ]; + boobVel += newState.localChestDisplacement[VX] * config.XYInfluence; + boobVel += newState.localChestDisplacement.mV[VY] * config.XYInfluence; + boobVel *= newState.frameDuration * 0.3f * 100.f; + boobVel = llclamp(boobVel, -config.velMax, config.velMax); + if(fabs(boobVel) <= config.velMax * config.velMin * newState.frameDuration * 100.f) + boobVel = 0.0f; + else + { + EmeraldBoobBounceState bounceState; + bounceState.bounceStart = inputs.elapsedTime; + bounceState.bounceStartFrameDuration = newState.frameDuration; + bounceState.bounceStartAmplitude = boobVel; + bounceState.bounceStartAmplitude *= avatarLocalMass; + bounceState.bounceStartAmplitude *= config.mass; + bounceStates.push_front(bounceState); + } + } + + /*if(fabs(newState.localChestDisplacement.length()) >= 0.f) { + LLVector3 displacementInfluence = newState.localChestDisplacement; + displacementInfluence *= LLVector3(0.3f, 0.3f, 1.0f); + F32 clampedDisplacementInfluenceLength = llclamp(displacementInfluence.length(), 0.0f, config.velMax); + if(displacementInfluence[VZ]<0.f) + clampedDisplacementInfluenceLength= -clampedDisplacementInfluenceLength; + EmeraldBoobBounceState bounceState; + bounceState.bounceStart = inputs.elapsedTime; + bounceState.bounceStartFrameDuration = newState.frameDuration; + bounceState.bounceStartAmplitude = clampedDisplacementInfluenceLength; + if(fabs(bounceState.bounceStartAmplitude) < config.velMin * config.velMax) + bounceState.bounceStartAmplitude = 0.0f; + else + { + bounceState.bounceStartAmplitude *= config.mass; + bounceStates.push_front(bounceState); + } + } + */ + + F32 totalNewAmplitude = 0.0f; + //std::cout << "Beginning bounce State processing at time " << inputs.elapsedTime << std::endl; + while(!bounceStates.empty()) { + EmeraldBoobBounceState bounceState = bounceStates.front(); + //std::cout << "Now processing " << bounceState; + bounceStates.pop_front(); + F32 bounceTime = newState.elapsedTime-bounceState.bounceStart; + F32 newAmplitude = bounceState.bounceStartAmplitude*pow(60.f*config.friction, -bounceTime)*cos(config.hardness*partMod*bounceTime); + if(fabs(newAmplitude) < 0.005f) { + newAmplitude = 0.0f; + } else { + newState.bounceStates.push_front(bounceState); + } + totalNewAmplitude+=newAmplitude; + } + //std::cout << "Total new amplitude: " << totalNewAmplitude << std::endl; + /* + if(inputs.type == 0) + newState.boobGrav = localConfig.actualBoobGrav + totalNewAmplitude; + if(inputs.type == 1) + newState.boobGrav = localConfig.actualButtGrav + totalNewAmplitude; + if(inputs.type == 2) + newState.boobGrav = localConfig.actualFatGrav + totalNewAmplitude; + */ + + newState.boobGrav = totalNewAmplitude; + + + newState.boobGrav = llclamp(newState.boobGrav, -1.5f, 2.0f); + + return newState; +} diff --git a/linden/indra/newview/emeraldboobutils.h b/linden/indra/newview/emeraldboobutils.h new file mode 100644 index 0000000..26008f9 --- /dev/null +++ b/linden/indra/newview/emeraldboobutils.h @@ -0,0 +1,197 @@ +#ifndef __emeraldboobutils_h +#define __emeraldboobutils_h + +#include +#include + +#include "stdtypes.h" +#include "v3math.h" +#include "llquaternion.h" + +struct EmeraldGlobalBoobConfig +{ + bool enabled; + F32 mass; + F32 hardness; + F32 zMax; + F32 velMin; + F32 velMax; + F32 zInfluence; + F32 friction; + F32 XYInfluence; + + EmeraldGlobalBoobConfig() + : enabled(false), + mass(6.4f), + hardness(0.67f), + zMax(1.29f), + velMin(0.0027f*0.017f), + velMax(0.0027f), + zInfluence(0.0f), + friction(0.35f), + XYInfluence(0.3f) + { + } + + bool operator==(const EmeraldGlobalBoobConfig &other) const + { + return + enabled == other.enabled && + mass == other.mass && + zMax == other.zMax && + velMax == other.velMax && + velMin == other.velMin && + zInfluence == other.zInfluence && + XYInfluence == other.XYInfluence && + friction == other.friction; + } +}; + +std::ostream &operator<<(std::ostream &os, const EmeraldGlobalBoobConfig &v); + +struct EmeraldAvatarLocalBoobConfig +{ + F32 actualBoobGrav; + F32 actualButtGrav; + F32 actualFatGrav; + F32 boobSize; + + EmeraldAvatarLocalBoobConfig() + : actualBoobGrav(0.0f), + actualButtGrav(0.0f), + actualFatGrav(0.0f), + boobSize(0.0f) + { + } + + bool operator==(const EmeraldAvatarLocalBoobConfig &other) const + { + return + actualBoobGrav == other.actualBoobGrav && + actualButtGrav == other.actualButtGrav && + actualFatGrav == other.actualFatGrav && + boobSize == other.boobSize; + } + +}; + +std::ostream &operator<<(std::ostream &os, const EmeraldAvatarLocalBoobConfig &v); + +struct EmeraldBoobBounceState; + +struct EmeraldBoobState +{ + F32 boobGrav; + LLVector3 chestPosition; + LLQuaternion chestRotation; + F32 elapsedTime; + F32 frameDuration; + LLVector3 chestDisplacement; + LLVector3 localChestDisplacement; + LLVector3 displacementForce; + F32 mysteryValue; + std::list bounceStates; + + EmeraldBoobState() + : boobGrav(0.0f), + chestPosition(0.0f,0.0f,0.0f), + chestRotation(0.0f,0.0f,0.0f,1.0f), + elapsedTime(0.0f), + frameDuration(0.0f), + chestDisplacement(0.0f,0.0f,0.0f), + localChestDisplacement(0.0f,0.0f,0.0f), + displacementForce(0.0f,0.0f,0.0f), + mysteryValue(0.0f) + { + } + + bool operator==(const EmeraldBoobState &other) const + { + return + boobGrav == other.boobGrav && + chestPosition == other.chestPosition && + chestRotation == other.chestRotation && + elapsedTime == other.elapsedTime && + frameDuration == other.frameDuration && + chestDisplacement == other.chestDisplacement && + localChestDisplacement == other.localChestDisplacement && + displacementForce == other.displacementForce && + mysteryValue == other.mysteryValue && + bounceStates == other.bounceStates; + } +}; + +std::ostream &operator<<(std::ostream &os, const EmeraldBoobState &v); + +struct EmeraldBoobInputs +{ + LLVector3 chestPosition; + LLQuaternion chestRotation; + F32 elapsedTime; + bool appearanceFlag; + bool appearanceAnimating; + S32 type; + + EmeraldBoobInputs() + : chestPosition(0.0f,0.0f,0.0f), + chestRotation(0.0f,0.0f,0.0f,1.0f), + elapsedTime(0.0f), + appearanceFlag(false), + appearanceAnimating(false), + type(0) + { + } + + bool operator==(const EmeraldBoobInputs &other) const + { + return + chestPosition == other.chestPosition && + chestRotation == other.chestRotation && + elapsedTime == other.elapsedTime && + appearanceFlag == other.appearanceFlag && + appearanceAnimating == other.appearanceAnimating && + type == other.type; + } +}; + +std::ostream &operator<<(std::ostream &os, const EmeraldBoobInputs &v); + +struct EmeraldBoobBounceState +{ + F32 bounceStart; + F32 bounceStartAmplitude; + F32 bounceStartFrameDuration; + + EmeraldBoobBounceState() + : bounceStart(0.0f), + bounceStartAmplitude(0.0f), + bounceStartFrameDuration(0.0f) + { + }; + + bool operator==(const EmeraldBoobBounceState &other) const + { + return + bounceStart == other.bounceStart && + bounceStartAmplitude == other.bounceStartAmplitude && + bounceStartFrameDuration == other.bounceStartFrameDuration; + } +}; + +std::ostream &operator<<(std::ostream &os, const EmeraldBoobBounceState &v); + + +struct EmeraldBoobUtils +{ +public: + static EmeraldBoobState idleUpdate(const EmeraldGlobalBoobConfig &config, const EmeraldAvatarLocalBoobConfig &localConfig, const EmeraldBoobState &oldState, const EmeraldBoobInputs &inputs); + + static F32 convertMass(F32 displayMass); + static F32 convertHardness(F32 displayHardness); + static F32 convertVelMax(F32 displayVelMax); + static F32 convertFriction(F32 displayFriction); + static F32 convertVelMin(F32 displayVelMin); +}; + + +#endif diff --git a/linden/indra/newview/gpu_table.txt b/linden/indra/newview/gpu_table.txt index 0b0ccea..e446a1d 100644 --- a/linden/indra/newview/gpu_table.txt +++ b/linden/indra/newview/gpu_table.txt @@ -47,7 +47,9 @@ ATI ASUS EAH26xx .*ATI.*ASUS.*EAH26.* 3 1 ATI ASUS EAH34xx .*ATI.*ASUS.*EAH34.* 1 1 ATI ASUS EAH36xx .*ATI.*ASUS.*EAH36.* 3 1 ATI ASUS EAH38xx .*ATI.*ASUS.*EAH38.* 3 1 +ATI ASUS EAH45xx .*ATI.*ASUS.*EAH45.* 1 1 ATI ASUS EAH48xx .*ATI.*ASUS.*EAH48.* 3 1 +ATI ASUS EAH57xx .*ATI.*ASUS.*EAH57.* 3 1 ATI Radeon X1xxx .*ATI.*ASUS.*X1.* 2 1 ATI Radeon X7xx .*ATI.*ASUS.*X7.* 1 1 ATI Radeon X500 .*ATI.*Diamond X5.* 1 1 @@ -95,10 +97,16 @@ ATI Radeon HD 3300 .*ATI.*Radeon HD.*33.* 1 1 ATI Radeon HD 3400 .*ATI.*Radeon HD.*34.* 1 1 ATI Radeon HD 3600 .*ATI.*Radeon HD.*36.* 3 1 ATI Radeon HD 3800 .*ATI.*Radeon HD.*38.* 3 1 +ATI Radeon HD 4200 .*ATI.*Radeon HD 42.* 1 1 ATI Radeon HD 4300 .*ATI.*Radeon HD 43.* 1 1 -ATI Radeon HD 4500 .*ATI.*Radeon HD 45.* 2 1 -ATI Radeon HD 4600 .*ATI.*Radeon HD 46.* 3 1 +ATI Radeon HD 4500 .*ATI.*Radeon HD 45.* 3 1 +ATI Radeon HD 4600 .*ATI.*Radeon HD.*46.* 3 1 +ATI Radeon HD 4700 .*ATI.*Radeon HD 47.* 3 1 ATI Radeon HD 4800 .*ATI.*Radeon.*HD.*48.* 3 1 +ATI Radeon HD 5600 .*ATI.*Radeon.*HD.*56.* 3 1 +ATI Radeon HD 5700 .*ATI.*Radeon.*HD.*57.* 3 1 +ATI Radeon HD 5800 .*ATI.*Radeon.*HD.*58.* 3 1 +ATI Radeon HD 5900 .*ATI.*Radeon.*HD.*59.* 3 1 ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 0 0 ATI Radeon 2100 .*ATI.*Radeon 21.* 0 1 ATI Radeon 3100 .*ATI.*Radeon 31.* 1 1 @@ -152,13 +160,17 @@ Intel 945G .*Intel.*945G.* 0 1 Intel 950 .*Intel.*950.* 0 1 Intel 965 .*Intel.*965.* 0 1 Intel G33 .*Intel.*G33.* 0 0 +Intel G41 .*Intel.*G41.* 0 1 Intel G45 .*Intel.*G45.* 0 1 Intel Bear Lake .*Intel.*Bear Lake.* 0 0 Intel Broadwater .*Intel.*Broadwater.* 0 0 Intel Brookdale .*Intel.*Brookdale.* 0 0 Intel Cantiga .*Intel.*Cantiga.* 0 0 -Intel Eaglelake .*Intel.*Eaglelake.* 0 0 +Intel Eaglelake .*Intel.*Eaglelake.* 0 1 +Intel Mobile 4 Series .*Intel.*Mobile.*4 Series.* 0 1 +Intel Media Graphics HD .*Intel.*Media.*Graphics.*HD.* 0 1 Intel Montara .*Intel.*Montara.* 0 0 +Intel Pineview .*Intel.*Pineview.* 0 1 Intel Springdale .*Intel.*Springdale.* 0 0 Matrox .*Matrox.* 0 0 Mesa .*Mesa.* 0 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 0000000..f402bd2 Binary files /dev/null and b/linden/indra/newview/installers/autoit/nrc_install.ico differ diff --git a/linden/indra/newview/installers/windows/install_icon.BMP b/linden/indra/newview/installers/windows/install_icon.BMP index 70d1e33..179cf82 100644 Binary files a/linden/indra/newview/installers/windows/install_icon.BMP and b/linden/indra/newview/installers/windows/install_icon.BMP differ diff --git a/linden/indra/newview/installers/windows/install_icon.ico b/linden/indra/newview/installers/windows/install_icon.ico index 712e3d8..f5d85d8 100644 Binary files a/linden/indra/newview/installers/windows/install_icon.ico and b/linden/indra/newview/installers/windows/install_icon.ico differ diff --git a/linden/indra/newview/installers/windows/installer_template.nsi b/linden/indra/newview/installers/windows/installer_template.nsi index faa8dbd..94a6614 100644 --- a/linden/indra/newview/installers/windows/installer_template.nsi +++ b/linden/indra/newview/installers/windows/installer_template.nsi @@ -1,5 +1,5 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; RainbowViewer setup.nsi +;; CoolViewer setup.nsi ;; Copyright 2004-2008, Linden Research, Inc. ;; ;; NSIS Unicode 2.38.1 or higher required @@ -56,9 +56,9 @@ LangString LanguageCode ${LANG_ENGLISH} "en-us" ;; Tweak for different servers/builds (this placeholder is replaced by viewer_manifest.py) ;; For example: ;; !define INSTFLAGS "%(flags)s" -;; !define INSTNAME "RainbowViewer%(grid_caps)s" -;; !define SHORTCUT "Rainbow Viewer (%(grid_caps)s)" -;; !define URLNAME "rainbowviewer%(grid)s" +;; !define INSTNAME "CoolViewer%(grid_caps)s" +;; !define SHORTCUT "Cool Viewer (%(grid_caps)s)" +;; !define URLNAME "coolviewer%(grid)s" ;; !define UNINSTALL_SETTINGS 1 %%GRID_VARS%% @@ -67,7 +67,7 @@ Name ${INSTNAME} SubCaption 0 $(LicenseSubTitleSetup) ; override "license agreement" text -BrandingText "Rainbow Viewer 1.22.12.0 R4" ; bottom of window text +BrandingText "Cool Viewer 1.22.12 R13 final" ; bottom of window text Icon %%SOURCE%%\res\install_icon.ico ; our custom icon UninstallIcon %%SOURCE%%\res\uninstall_icon.ico ; our custom icon WindowIcon on ; show our icon in left corner @@ -79,9 +79,13 @@ SetOverwrite on ; stomp files by default AutoCloseWindow true ; after all files install, close window InstallDir "$PROGRAMFILES\${INSTNAME}" -InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\RainbowViewer\${INSTNAME}" "" +InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\CoolViewer\${INSTNAME}" "" DirText $(DirectoryChooseTitle) $(DirectoryChooseSetup) +LicenseText "Please read the following carefully. You must understand and agree to these terms if you want to install and use Rainbow Viewer::Cool Edition." +LicenseData "%%SOURCE%%\license.txt" +LicenseForceSelection checkbox +LicenseForceSelection checkbox "I have read all, I understand and I accept!" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Variables @@ -184,7 +188,7 @@ FunctionEnd ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function CheckIfAlreadyCurrent Push $0 - ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\RainbowViewer\$INSTPROG" "Version" + ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\CoolViewer\$INSTPROG" "Version" StrCmp $0 ${VERSION_LONG} 0 DONE MessageBox MB_OKCANCEL $(CheckIfCurrentMB) /SD IDOK IDOK DONE Quit @@ -198,17 +202,17 @@ FunctionEnd ; Close the program, if running. Modifies no variables. ; Allows user to bail out of install process. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Function CloseRainbowViewer +Function CloseCoolViewer Push $0 FindWindow $0 "Second Life" "" IntCmp $0 0 DONE - MessageBox MB_OKCANCEL $(CloseRainbowViewerInstMB) IDOK CLOSE IDCANCEL CANCEL_INSTALL + MessageBox MB_OKCANCEL $(CloseCoolViewerInstMB) IDOK CLOSE IDCANCEL CANCEL_INSTALL CANCEL_INSTALL: Quit CLOSE: - DetailPrint $(CloseRainbowViewerInstDP) + DetailPrint $(CloseCoolViewerInstDP) SendMessage $0 16 0 0 LOOP: @@ -270,12 +274,12 @@ FunctionEnd ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Delete files in Documents and Settings\\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 +302,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 +317,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 +335,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 +367,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 +397,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 +451,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 +591,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 +609,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 +619,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 +643,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 +677,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 +699,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 b860b53..e1bee81 100644 Binary files a/linden/indra/newview/installers/windows/lang_en-us.nsi and b/linden/indra/newview/installers/windows/lang_en-us.nsi differ diff --git a/linden/indra/newview/llagent.cpp b/linden/indra/newview/llagent.cpp index d5ce5b7..07d5516 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 @@ -205,15 +208,16 @@ const F32 MIN_RADIUS_ALPHA_SIZZLE = 0.5f; const F64 CHAT_AGE_FAST_RATE = 3.0; -const S32 MAX_WEARABLES_PER_LAYERSET = 7; +const S32 MAX_WEARABLES_PER_LAYERSET = 9; const EWearableType WEARABLE_BAKE_TEXTURE_MAP[BAKED_TEXTURE_COUNT][MAX_WEARABLES_PER_LAYERSET] = { - { WT_SHAPE, WT_SKIN, WT_HAIR, WT_INVALID, WT_INVALID, WT_INVALID, WT_INVALID }, // TEX_HEAD_BAKED - { WT_SHAPE, WT_SKIN, WT_SHIRT, WT_JACKET, WT_GLOVES, WT_UNDERSHIRT, WT_INVALID }, // TEX_UPPER_BAKED - { WT_SHAPE, WT_SKIN, WT_PANTS, WT_SHOES, WT_SOCKS, WT_JACKET, WT_UNDERPANTS }, // TEX_LOWER_BAKED - { WT_EYES, WT_INVALID, WT_INVALID, WT_INVALID, WT_INVALID, WT_INVALID, WT_INVALID }, // TEX_EYES_BAKED - { WT_SKIRT, WT_INVALID, WT_INVALID, WT_INVALID, WT_INVALID, WT_INVALID, WT_INVALID } // TEX_SKIRT_BAKED + { WT_SHAPE, WT_SKIN, WT_HAIR, WT_TATTOO, WT_ALPHA, WT_INVALID, WT_INVALID, WT_INVALID, WT_INVALID }, // TEX_HEAD_BAKED + { WT_SHAPE, WT_SKIN, WT_SHIRT, WT_JACKET, WT_GLOVES, WT_UNDERSHIRT, WT_TATTOO, WT_ALPHA, WT_INVALID }, // TEX_UPPER_BAKED + { WT_SHAPE, WT_SKIN, WT_PANTS, WT_SHOES, WT_SOCKS, WT_JACKET, WT_UNDERPANTS, WT_TATTOO, WT_ALPHA }, // TEX_LOWER_BAKED + { WT_EYES, WT_ALPHA, WT_INVALID, WT_INVALID, WT_INVALID, WT_INVALID, WT_INVALID, WT_INVALID, WT_INVALID }, // TEX_EYES_BAKED + { WT_SKIRT, WT_INVALID, WT_INVALID, WT_INVALID, WT_INVALID, WT_INVALID, WT_INVALID, WT_INVALID, WT_INVALID }, // TEX_SKIRT_BAKED + { WT_HAIR, WT_ALPHA, WT_INVALID, WT_INVALID, WT_INVALID, WT_INVALID, WT_INVALID, WT_INVALID, WT_INVALID } // TEX_HAIR_BAKED }; const LLUUID BAKED_TEXTURE_HASH[BAKED_TEXTURE_COUNT] = @@ -222,7 +226,8 @@ const LLUUID BAKED_TEXTURE_HASH[BAKED_TEXTURE_COUNT] = LLUUID("338c29e3-3024-4dbb-998d-7c04cf4fa88f"), LLUUID("91b4a2c7-1b1a-ba16-9a16-1f8f8dcc1c3f"), LLUUID("b2cf28af-b840-1071-3c6a-78085d8128b5"), - LLUUID("ea800387-ea1a-14e0-56cb-24f2022f969a") + LLUUID("ea800387-ea1a-14e0-56cb-24f2022f969a"), + LLUUID("0af1ef7c-ad24-11dd-8790-001f5bf833e8") }; // The agent instance. @@ -564,6 +569,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 +767,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 +812,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 +868,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. @@ -2049,8 +2079,9 @@ U32 LLAgent::getControlFlags() //----------------------------------------------------------------------------- void LLAgent::setControlFlags(U32 mask) { + U32 old_flags = mControlFlags; mControlFlags |= mask; - mbFlagsDirty = TRUE; + mbFlagsDirty = mControlFlags ^ old_flags; } @@ -4207,6 +4238,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; @@ -5957,7 +5994,7 @@ void LLAgent::processAgentCachedTextureResponse(LLMessageSystem *mesgsys, void * && (S32)texture_index < BAKED_TEXTURE_COUNT && gAgent.mActiveCacheQueries[ texture_index ] == query_id) { - //llinfos << "Received cached texture " << (U32)texture_index << ": " << texture_id << llendl; + llinfos << "Received cached texture " << (U32)texture_index << ": " << texture_id << llendl; avatarp->setCachedBakedTexture((LLVOAvatar::ETextureIndex)LLVOAvatar::sBakedTextureIndices[texture_index], texture_id); //avatarp->setTETexture( LLVOAvatar::sBakedTextureIndices[texture_index], texture_id ); gAgent.mActiveCacheQueries[ texture_index ] = 0; @@ -6084,8 +6121,19 @@ bool LLAgent::teleportCore(bool is_local) //release geometry from old location gPipeline.resetVertexBuffers(); + + if (gSavedSettings.getBOOL("SpeedRez")) + { + F32 draw_distance = gSavedSettings.getF32("RenderFarClip"); + if (gSavedDrawDistance < draw_distance) + { + gSavedDrawDistance = draw_distance; + } + gSavedSettings.setF32("SavedRenderFarClip", gSavedDrawDistance); + gSavedSettings.setF32("RenderFarClip", 32.0f); + } + make_ui_sound("UISndTeleportOut"); } - make_ui_sound("UISndTeleportOut"); // MBW -- Let the voice client know a teleport has begun so it can leave the existing channel. // This was breaking the case of teleporting within a single sim. Backing it out for now. @@ -6120,6 +6168,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 +6194,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 +6250,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) @@ -6224,6 +6301,34 @@ void LLAgent::teleportViaLocation(const LLVector3d& pos_global) } } +void LLAgent::stopCurrentAnimations() +{ + // This function stops all current overriding animations on this + // avatar, propagating this change back to the server. + + LLVOAvatar* avatarp = gAgent.getAvatarObject(); + if (avatarp) + { + for (LLVOAvatar::AnimIterator anim_it = avatarp->mPlayingAnimations.begin(); + anim_it != avatarp->mPlayingAnimations.end(); anim_it++) + { + // don't cancel a ground-sit anim, as viewers use this animation's status in + // determining whether we're sitting. ick. + if (anim_it->first != ANIM_AGENT_SIT_GROUND_CONSTRAINED) + { + // stop this animation locally + avatarp->stopMotion(anim_it->first, TRUE); + // ...and tell the server to tell everyone. + sendAnimationRequest(anim_it->first, ANIM_REQUEST_STOP); + } + } + + // re-assert at least the default standing animation, because + // viewers get confused by avs with no associated anims. + sendAnimationRequest(ANIM_AGENT_STAND, ANIM_REQUEST_START); + } +} + void LLAgent::setTeleportState(ETeleportState state) { mTeleportState = state; @@ -6982,7 +7087,9 @@ void LLAgent::createStandardWearables(BOOL female) FALSE, //WT_GLOVES TRUE, //WT_UNDERSHIRT TRUE, //WT_UNDERPANTS - FALSE //WT_SKIRT + FALSE, //WT_SKIRT + FALSE, //WT_ALPHA + FALSE //WT_TATTOO }; for( S32 i=0; i < WT_COUNT; i++ ) @@ -7213,7 +7320,8 @@ void LLAgent::sendAgentSetAppearance() (( mAvatarObject->getTEImage( LLVOAvatar::TEX_HEAD_BAKED )->getID() != IMG_DEFAULT_AVATAR ) ? "HEAD " : "head " ) << (( mAvatarObject->getTEImage( LLVOAvatar::TEX_UPPER_BAKED )->getID() != IMG_DEFAULT_AVATAR ) ? "UPPER " : "upper " ) << (( mAvatarObject->getTEImage( LLVOAvatar::TEX_LOWER_BAKED )->getID() != IMG_DEFAULT_AVATAR ) ? "LOWER " : "lower " ) << - (( mAvatarObject->getTEImage( LLVOAvatar::TEX_EYES_BAKED )->getID() != IMG_DEFAULT_AVATAR ) ? "EYES" : "eyes" ) << llendl; + (( mAvatarObject->getTEImage( LLVOAvatar::TEX_EYES_BAKED )->getID() != IMG_DEFAULT_AVATAR ) ? "EYES " : "eyes " ) << + (( mAvatarObject->getTEImage( LLVOAvatar::TEX_HAIR_BAKED )->getID() != IMG_DEFAULT_AVATAR ) ? "HAIR" : "hair" ) << llendl; //dumpAvatarTEs( "sendAgentSetAppearance()" ); LLMessageSystem* msg = gMessageSystem; @@ -7298,13 +7406,20 @@ void LLAgent::sendAgentSetAppearance() param; param = (LLViewerVisualParam*)mAvatarObject->getNextVisualParam()) { - F32 param_value = param->getWeight(); - if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) { msg->nextBlockFast(_PREHASH_VisualParam ); // We don't send the param ids. Instead, we assume that the receiver has the same params in the same sequence. + F32 param_value; + if(param->getID() == 507) + param_value = mAvatarObject->getActualBoobGrav(); + else if(param->getID() == 795) + param_value = mAvatarObject->getActualButtGrav(); + else if(param->getID() == 157) + param_value = mAvatarObject->getActualFatGrav(); + else + param_value = param->getWeight(); U8 new_weight = F32_to_U8(param_value, param->getMinWeight(), param->getMaxWeight()); msg->addU8Fast(_PREHASH_ParamValue, new_weight ); transmitted_params++; @@ -7327,7 +7442,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)) { @@ -7466,6 +7590,8 @@ void LLAgent::setWearableOutfit( wearables_to_remove[WT_UNDERSHIRT] = (!gAgent.isTeen()) & remove; wearables_to_remove[WT_UNDERPANTS] = (!gAgent.isTeen()) & remove; wearables_to_remove[WT_SKIRT] = remove; + wearables_to_remove[WT_ALPHA] = remove; + wearables_to_remove[WT_TATTOO] = remove; S32 count = wearables.count(); llassert( items.count() == count ); @@ -7556,9 +7682,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()) ) @@ -7734,6 +7882,8 @@ void LLAgent::userRemoveAllClothesStep2( BOOL proceed, void* userdata ) gAgent.removeWearable( WT_UNDERSHIRT ); gAgent.removeWearable( WT_UNDERPANTS ); gAgent.removeWearable( WT_SKIRT ); + gAgent.removeWearable( WT_ALPHA ); + gAgent.removeWearable( WT_TATTOO ); } } diff --git a/linden/indra/newview/llagent.h b/linden/indra/newview/llagent.h index 8420947..5005abd 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(); @@ -400,6 +408,7 @@ class LLAgent : public LLObservable BOOL canFly(); // Animation functions + void stopCurrentAnimations(); void requestStopMotion( LLMotion* motion ); void onAnimStop(const LLUUID& id); diff --git a/linden/indra/newview/llappviewer.cpp b/linden/indra/newview/llappviewer.cpp index bc13bb9..f6e847f 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("RestrainedLove")) { - 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("RestrainedLove")) { - if (LLURLDispatcher::isSLURLCommand(slurl)) - { - LLStartUp::sSLURLCommand = slurl; - } - else +//mk + std::string slurl = clp.getOption("slurl")[0]; + if(LLURLDispatcher::isSLURL(slurl)) { - 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. @@ -2560,7 +2623,7 @@ void LLAppViewer::requestQuit() gFloaterView->closeAllChildren(true); } - send_stats(); + // send_stats(); gLogoutTimer.reset(); mQuitRequested = true; @@ -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); @@ -3137,12 +3200,12 @@ void LLAppViewer::idle() // Update session stats every large chunk of time // *FIX: (???) SAMANTHA - if (viewer_stats_timer.getElapsedTimeF32() >= SEND_STATS_PERIOD && !gDisconnected) + /* if (viewer_stats_timer.getElapsedTimeF32() >= SEND_STATS_PERIOD && !gDisconnected) { llinfos << "Transmitting sessions stats" << llendl; send_stats(); viewer_stats_timer.reset(); - } + } */ // Print the object debugging stats static LLFrameTimer object_debug_timer; 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/llassetuploadresponders.cpp b/linden/indra/newview/llassetuploadresponders.cpp index 9a9ed0e..1df04aa 100644 --- a/linden/indra/newview/llassetuploadresponders.cpp +++ b/linden/indra/newview/llassetuploadresponders.cpp @@ -294,7 +294,6 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content) } } - LLUpdateAgentInventoryResponder::LLUpdateAgentInventoryResponder(const LLSD& post_data, const LLUUID& vfile_id, LLAssetType::EType asset_type) 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.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/lldrawpoolavatar.cpp b/linden/indra/newview/lldrawpoolavatar.cpp index 7ab6428..4a15032 100644 --- a/linden/indra/newview/lldrawpoolavatar.cpp +++ b/linden/indra/newview/lldrawpoolavatar.cpp @@ -52,6 +52,8 @@ static U32 sDataMask = LLDrawPoolAvatar::VERTEX_DATA_MASK; static U32 sBufferUsage = GL_STREAM_DRAW_ARB; static U32 sShaderLevel = 0; static LLGLSLShader* sVertexProgram = NULL; +BOOL LLDrawPoolAvatar::sSkipOpaque = FALSE; +BOOL LLDrawPoolAvatar::sSkipTransparent = FALSE; F32 CLOTHING_GRAVITY_EFFECT = 0.7f; F32 CLOTHING_ACCEL_FORCE_FACTOR = 0.2f; diff --git a/linden/indra/newview/lldrawpoolavatar.h b/linden/indra/newview/lldrawpoolavatar.h index e14ba86..3da30f5 100644 --- a/linden/indra/newview/lldrawpoolavatar.h +++ b/linden/indra/newview/lldrawpoolavatar.h @@ -85,6 +85,9 @@ class LLDrawPoolAvatar : public LLFacePool /*virtual*/ LLColor3 getDebugColor() const; // For AGP debug display void renderAvatars(LLVOAvatar *single_avatar, S32 pass = -1); // renders only one avatar if single_avatar is not null. + + static BOOL sSkipOpaque; + static BOOL sSkipTransparent; }; diff --git a/linden/indra/newview/llfilepicker.cpp b/linden/indra/newview/llfilepicker.cpp index 954a274..439368c 100644 --- a/linden/indra/newview/llfilepicker.cpp +++ b/linden/indra/newview/llfilepicker.cpp @@ -1100,6 +1100,12 @@ static std::string add_imageload_filter_to_gtkchooser(GtkWindow *picker) return filtername; } +static std::string add_xml_filter_to_gtkchooser(GtkWindow *picker) +{ + return add_simple_pattern_filter_to_gtkchooser(picker, "*.xml", + LLTrans::getString("xml_file") + " (*.xml)"); +} + BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename ) { @@ -1215,6 +1221,9 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter ) case FFLOAD_IMAGE: filtername = add_imageload_filter_to_gtkchooser(picker); break; + case FFLOAD_XML: + filtername = add_xml_filter_to_gtkchooser(picker); + break; default:; break; } diff --git a/linden/indra/newview/llfloaterabout.cpp b/linden/indra/newview/llfloaterabout.cpp index 19b7653..548fc59 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 @@ -110,17 +113,30 @@ LLFloaterAbout::LLFloaterAbout() viewer_link_style->setColor(gSavedSettings.getColor4("HTMLLinkColor")); // Version string - std::string version = LLAppViewer::instance()->getSecondLifeTitle() - + llformat(" %d.%d.%d (%d) %s %s (%s)\n", + std::string version = llformat("Rainbow Viewer::Cool Edition %d.%d.%d (%d) SSE2GL, %s %s\nChannel: %s\n", 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.getVersion2 () + "\n"; + } +//mk support_widget->appendColoredText(version, FALSE, FALSE, gColors.getColor("TextFgReadOnlyColor")); support_widget->appendStyledText(LLTrans::getString("ReleaseNotes"), FALSE, FALSE, &viewer_link_style); std::string support; support.append("\n\n"); +#if LL_MSVC + support.append(llformat("Built with MSVC version %d\n\n", _MSC_VER)); +#endif + +#if LL_GNUC + support.append(llformat("Built with GCC version %d\n\n", GCC_VERSION)); +#endif + // Position LLViewerRegion* region = gAgent.getRegion(); if (region) @@ -135,22 +151,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); @@ -270,12 +308,8 @@ static std::string get_viewer_release_notes_url() << LL_VERSION_PATCH << "." << LL_VERSION_BUILD; - LLSD query; - query["channel"] = gSavedSettings.getString("VersionChannelName"); - query["version"] = version.str(); - std::ostringstream url; - url << RELEASE_NOTES_BASE_URL << LLURI::mapToQueryString(query); + url << RELEASE_NOTES_BASE_URL; return url.str(); } diff --git a/linden/indra/newview/llfloateranimpreview.cpp b/linden/indra/newview/llfloateranimpreview.cpp index c75f9e3..17ba306 100644 --- a/linden/indra/newview/llfloateranimpreview.cpp +++ b/linden/indra/newview/llfloateranimpreview.cpp @@ -64,6 +64,7 @@ #include "llvoavatar.h" #include "pipeline.h" #include "lluictrlfactory.h" +#include "llviewercontrol.h" S32 LLFloaterAnimPreview::sUploadAmount = 10; @@ -158,12 +159,27 @@ BOOL LLFloaterAnimPreview::postBuild() return FALSE; } + mInWorld = gSavedSettings.getBOOL("PreviewAnimInWorld"); + childSetCommitCallback("name_form", onCommitName, this); childSetLabelArg("ok_btn", "[AMOUNT]", llformat("%d",sUploadAmount)); childSetAction("ok_btn", onBtnOK, this); setDefaultBtn(); + if (mInWorld) + { + r = getRect(); + translate(0, 230); + reshape(r.getWidth(), r.getHeight() - 230); + childSetValue("bad_animation_text", getString("in_world")); + childShow("bad_animation_text"); + } + else + { + childHide("bad_animation_text"); + } + mPreviewRect.set(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT, getRect().getWidth() - PREVIEW_HPAD, @@ -205,8 +221,6 @@ BOOL LLFloaterAnimPreview::postBuild() r.set(r.mRight + PREVIEW_HPAD, y, getRect().getWidth() - PREVIEW_HPAD, y - BTN_HEIGHT); //childSetCommitCallback("playback_slider", onSliderMove, this); - childHide("bad_animation_text"); - //childSetCommitCallback("preview_base_anim", onCommitBaseAnim, this); //childSetValue("preview_base_anim", "Standing"); @@ -269,7 +283,14 @@ BOOL LLFloaterAnimPreview::postBuild() // motion will be returned, but it will be in a load-pending state, as this is a new motion // this motion will not request an asset transfer until next update, so we have a chance to // load the keyframe data locally - motionp = (LLKeyframeMotion*)mAnimPreview->getDummyAvatar()->createMotion(mMotionID); + if (mInWorld) + { + motionp = (LLKeyframeMotion*)gAgent.getAvatarObject()->createMotion(mMotionID); + } + else + { + motionp = (LLKeyframeMotion*)mAnimPreview->getDummyAvatar()->createMotion(mMotionID); + } // create data buffer for keyframe initialization S32 buffer_size = loaderp->getOutputSize(); @@ -287,24 +308,30 @@ BOOL LLFloaterAnimPreview::postBuild() if (success) { setAnimCallbacks() ; - - const LLBBoxLocal &pelvis_bbox = motionp->getPelvisBBox(); - LLVector3 temp = pelvis_bbox.getCenter(); - // only consider XY? - //temp.mV[VZ] = 0.f; - F32 pelvis_offset = temp.magVec(); + if (!mInWorld) + { + const LLBBoxLocal &pelvis_bbox = motionp->getPelvisBBox(); - temp = pelvis_bbox.getExtent(); - //temp.mV[VZ] = 0.f; - F32 pelvis_max_displacement = pelvis_offset + (temp.magVec() * 0.5f) + 1.f; - - F32 camera_zoom = LLViewerCamera::getInstance()->getDefaultFOV() / (2.f * atan(pelvis_max_displacement / PREVIEW_CAMERA_DISTANCE)); - - mAnimPreview->setZoom(camera_zoom); + LLVector3 temp = pelvis_bbox.getCenter(); + // only consider XY? + //temp.mV[VZ] = 0.f; + F32 pelvis_offset = temp.magVec(); + + temp = pelvis_bbox.getExtent(); + //temp.mV[VZ] = 0.f; + F32 pelvis_max_displacement = pelvis_offset + (temp.magVec() * 0.5f) + 1.f; + + F32 camera_zoom = LLViewerCamera::getInstance()->getDefaultFOV() / (2.f * atan(pelvis_max_displacement / PREVIEW_CAMERA_DISTANCE)); + + mAnimPreview->setZoom(camera_zoom); + } motionp->setName(childGetValue("name_form").asString()); - mAnimPreview->getDummyAvatar()->startMotion(mMotionID); + if (!mInWorld) + { + mAnimPreview->getDummyAvatar()->startMotion(mMotionID); + } childSetMinValue("playback_slider", 0.0); childSetMaxValue("playback_slider", 1.0); @@ -365,6 +392,26 @@ BOOL LLFloaterAnimPreview::postBuild() //----------------------------------------------------------------------------- LLFloaterAnimPreview::~LLFloaterAnimPreview() { + if (mInWorld) + { + LLVOAvatar* avatarp = gAgent.getAvatarObject(); + if (avatarp) + { + if (mMotionID.notNull()) + { + avatarp->stopMotion(mMotionID, TRUE); + avatarp->removeMotion(mMotionID); + } + avatarp->deactivateAllMotions(); + avatarp->startMotion(ANIM_AGENT_HEAD_ROT); + avatarp->startMotion(ANIM_AGENT_EYE); + avatarp->startMotion(ANIM_AGENT_BODY_NOISE); + avatarp->startMotion(ANIM_AGENT_BREATHE_ROT); + avatarp->startMotion(ANIM_AGENT_HAND_MOTION); + avatarp->startMotion(ANIM_AGENT_PELVIS_FIX); + avatarp->startMotion(ANIM_AGENT_STAND, BASE_ANIM_TIME_OFFSET); + } + } delete mAnimPreview; mAnimPreview = NULL; @@ -381,7 +428,7 @@ void LLFloaterAnimPreview::draw() refresh(); - if (mMotionID.notNull() && mAnimPreview) + if (mMotionID.notNull() && mAnimPreview && !mInWorld) { gGL.color3f(1.f, 1.f, 1.f); @@ -415,7 +462,20 @@ void LLFloaterAnimPreview::draw() //----------------------------------------------------------------------------- void LLFloaterAnimPreview::resetMotion() { - LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar(); + LLVOAvatar* avatarp; + if (mInWorld) + { + avatarp = gAgent.getAvatarObject(); + } + else + { + avatarp = mAnimPreview->getDummyAvatar(); + } + if (!avatarp) + { + return; + } + BOOL paused = avatarp->areAnimationsPaused(); // *TODO: Fix awful casting hack @@ -451,7 +511,7 @@ void LLFloaterAnimPreview::resetMotion() //----------------------------------------------------------------------------- BOOL LLFloaterAnimPreview::handleMouseDown(S32 x, S32 y, MASK mask) { - if (mPreviewRect.pointInRect(x, y)) + if (!mInWorld && mPreviewRect.pointInRect(x, y)) { bringToFront( x, y ); gFocusMgr.setMouseCapture(this); @@ -469,8 +529,11 @@ BOOL LLFloaterAnimPreview::handleMouseDown(S32 x, S32 y, MASK mask) //----------------------------------------------------------------------------- BOOL LLFloaterAnimPreview::handleMouseUp(S32 x, S32 y, MASK mask) { - gFocusMgr.setMouseCapture(FALSE); - gViewerWindow->showCursor(); + if (!mInWorld) + { + gFocusMgr.setMouseCapture(FALSE); + gViewerWindow->showCursor(); + } return LLFloater::handleMouseUp(x, y, mask); } @@ -479,6 +542,11 @@ BOOL LLFloaterAnimPreview::handleMouseUp(S32 x, S32 y, MASK mask) //----------------------------------------------------------------------------- BOOL LLFloaterAnimPreview::handleHover(S32 x, S32 y, MASK mask) { + if (mInWorld) + { + return TRUE; + } + MASK local_mask = mask & ~MASK_ALT; if (mAnimPreview && hasMouseCapture()) @@ -534,9 +602,11 @@ BOOL LLFloaterAnimPreview::handleHover(S32 x, S32 y, MASK mask) //----------------------------------------------------------------------------- BOOL LLFloaterAnimPreview::handleScrollWheel(S32 x, S32 y, S32 clicks) { - mAnimPreview->zoom((F32)clicks * -0.2f); - mAnimPreview->requestUpdate(); - + if (!mInWorld) + { + mAnimPreview->zoom((F32)clicks * -0.2f); + mAnimPreview->requestUpdate(); + } return TRUE; } @@ -545,7 +615,10 @@ BOOL LLFloaterAnimPreview::handleScrollWheel(S32 x, S32 y, S32 clicks) //----------------------------------------------------------------------------- void LLFloaterAnimPreview::onMouseCaptureLost() { - gViewerWindow->showCursor(); + if (!mInWorld) + { + gViewerWindow->showCursor(); + } } //----------------------------------------------------------------------------- @@ -557,9 +630,25 @@ void LLFloaterAnimPreview::onBtnPlay(void* user_data) if (!previewp->getEnabled()) return; - if (previewp->mMotionID.notNull() && previewp->mAnimPreview) + if (previewp->mMotionID.notNull()) { - LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar(); + LLVOAvatar* avatarp; + if (previewp->mInWorld) + { + if (!gAgent.getAvatarObject()) + { + return; + } + avatarp = gAgent.getAvatarObject(); + } + else + { + if (!previewp->mAnimPreview) + { + return; + } + avatarp = previewp->mAnimPreview->getDummyAvatar(); + } if(!avatarp->isMotionActive(previewp->mMotionID)) { @@ -589,9 +678,25 @@ void LLFloaterAnimPreview::onBtnStop(void* user_data) if (!previewp->getEnabled()) return; - if (previewp->mMotionID.notNull() && previewp->mAnimPreview) + if (previewp->mMotionID.notNull()) { - LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar(); + LLVOAvatar* avatarp; + if (previewp->mInWorld) + { + if (!gAgent.getAvatarObject()) + { + return; + } + avatarp = gAgent.getAvatarObject(); + } + else + { + if (!previewp->mAnimPreview) + { + return; + } + avatarp = previewp->mAnimPreview->getDummyAvatar(); + } previewp->resetMotion(); previewp->mPauseRequest = avatarp->requestPause(); } @@ -606,21 +711,33 @@ void LLFloaterAnimPreview::onSliderMove(LLUICtrl* ctrl, void*user_data) if (!previewp->getEnabled()) return; - if (previewp->mAnimPreview) - { - LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar(); - F32 slider_value = (F32)previewp->childGetValue("playback_slider").asReal(); - LLUUID base_id = previewp->mIDList[previewp->childGetValue("preview_base_anim").asString()]; - LLMotion* motionp = avatarp->findMotion(previewp->mMotionID); - F32 duration = motionp->getDuration();// + motionp->getEaseOutDuration(); - F32 delta_time = duration * slider_value; - avatarp->deactivateAllMotions(); - avatarp->startMotion(base_id, delta_time + BASE_ANIM_TIME_OFFSET); - avatarp->startMotion(previewp->mMotionID, delta_time); - previewp->mPauseRequest = avatarp->requestPause(); - previewp->refresh(); + LLVOAvatar* avatarp; + if (previewp->mInWorld) + { + if (!gAgent.getAvatarObject()) + { + return; + } + avatarp = gAgent.getAvatarObject(); } - + else + { + if (!previewp->mAnimPreview) + { + return; + } + avatarp = previewp->mAnimPreview->getDummyAvatar(); + } + F32 slider_value = (F32)previewp->childGetValue("playback_slider").asReal(); + LLUUID base_id = previewp->mIDList[previewp->childGetValue("preview_base_anim").asString()]; + LLMotion* motionp = avatarp->findMotion(previewp->mMotionID); + F32 duration = motionp->getDuration();// + motionp->getEaseOutDuration(); + F32 delta_time = duration * slider_value; + avatarp->deactivateAllMotions(); + avatarp->startMotion(base_id, delta_time + BASE_ANIM_TIME_OFFSET); + avatarp->startMotion(previewp->mMotionID, delta_time); + previewp->mPauseRequest = avatarp->requestPause(); + previewp->refresh(); } //----------------------------------------------------------------------------- @@ -632,24 +749,37 @@ void LLFloaterAnimPreview::onCommitBaseAnim(LLUICtrl* ctrl, void* data) if (!previewp->getEnabled()) return; - if (previewp->mAnimPreview) + LLVOAvatar* avatarp; + if (previewp->mInWorld) { - LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar(); + if (!gAgent.getAvatarObject()) + { + return; + } + avatarp = gAgent.getAvatarObject(); + } + else + { + if (!previewp->mAnimPreview) + { + return; + } + avatarp = previewp->mAnimPreview->getDummyAvatar(); + } - BOOL paused = avatarp->areAnimationsPaused(); + BOOL paused = avatarp->areAnimationsPaused(); - // stop all other possible base motions - avatarp->stopMotion(ANIM_AGENT_STAND, TRUE); - avatarp->stopMotion(ANIM_AGENT_WALK, TRUE); - avatarp->stopMotion(ANIM_AGENT_SIT, TRUE); - avatarp->stopMotion(ANIM_AGENT_HOVER, TRUE); + // stop all other possible base motions + avatarp->stopMotion(ANIM_AGENT_STAND, TRUE); + avatarp->stopMotion(ANIM_AGENT_WALK, TRUE); + avatarp->stopMotion(ANIM_AGENT_SIT, TRUE); + avatarp->stopMotion(ANIM_AGENT_HOVER, TRUE); - previewp->resetMotion(); + previewp->resetMotion(); - if (!paused) - { - previewp->mPauseRequest = NULL; - } + if (!paused) + { + previewp->mPauseRequest = NULL; } } @@ -662,7 +792,23 @@ void LLFloaterAnimPreview::onCommitLoop(LLUICtrl* ctrl, void* data) if (!previewp->getEnabled()) return; - LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar(); + LLVOAvatar* avatarp; + if (previewp->mInWorld) + { + if (!gAgent.getAvatarObject()) + { + return; + } + avatarp = gAgent.getAvatarObject(); + } + else + { + if (!previewp->mAnimPreview) + { + return; + } + avatarp = previewp->mAnimPreview->getDummyAvatar(); + } LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID); if (motionp) @@ -682,7 +828,23 @@ void LLFloaterAnimPreview::onCommitLoopIn(LLUICtrl* ctrl, void* data) if (!previewp->getEnabled()) return; - LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar(); + LLVOAvatar* avatarp; + if (previewp->mInWorld) + { + if (!gAgent.getAvatarObject()) + { + return; + } + avatarp = gAgent.getAvatarObject(); + } + else + { + if (!previewp->mAnimPreview) + { + return; + } + avatarp = previewp->mAnimPreview->getDummyAvatar(); + } LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID); if (motionp) @@ -703,7 +865,23 @@ void LLFloaterAnimPreview::onCommitLoopOut(LLUICtrl* ctrl, void* data) if (!previewp->getEnabled()) return; - LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar(); + LLVOAvatar* avatarp; + if (previewp->mInWorld) + { + if (!gAgent.getAvatarObject()) + { + return; + } + avatarp = gAgent.getAvatarObject(); + } + else + { + if (!previewp->mAnimPreview) + { + return; + } + avatarp = previewp->mAnimPreview->getDummyAvatar(); + } LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID); if (motionp) @@ -724,7 +902,23 @@ void LLFloaterAnimPreview::onCommitName(LLUICtrl* ctrl, void* data) if (!previewp->getEnabled()) return; - LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar(); + LLVOAvatar* avatarp; + if (previewp->mInWorld) + { + if (!gAgent.getAvatarObject()) + { + return; + } + avatarp = gAgent.getAvatarObject(); + } + else + { + if (!previewp->mAnimPreview) + { + return; + } + avatarp = previewp->mAnimPreview->getDummyAvatar(); + } LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID); if (motionp) @@ -768,7 +962,23 @@ void LLFloaterAnimPreview::onCommitPriority(LLUICtrl* ctrl, void* data) if (!previewp->getEnabled()) return; - LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar(); + LLVOAvatar* avatarp; + if (previewp->mInWorld) + { + if (!gAgent.getAvatarObject()) + { + return; + } + avatarp = gAgent.getAvatarObject(); + } + else + { + if (!previewp->mAnimPreview) + { + return; + } + avatarp = previewp->mAnimPreview->getDummyAvatar(); + } LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID); motionp->setPriority(llfloor((F32)previewp->childGetValue("priority").asReal())); @@ -783,7 +993,23 @@ void LLFloaterAnimPreview::onCommitEaseIn(LLUICtrl* ctrl, void* data) if (!previewp->getEnabled()) return; - LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar(); + LLVOAvatar* avatarp; + if (previewp->mInWorld) + { + if (!gAgent.getAvatarObject()) + { + return; + } + avatarp = gAgent.getAvatarObject(); + } + else + { + if (!previewp->mAnimPreview) + { + return; + } + avatarp = previewp->mAnimPreview->getDummyAvatar(); + } LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID); motionp->setEaseIn((F32)previewp->childGetValue("ease_in_time").asReal()); @@ -799,7 +1025,23 @@ void LLFloaterAnimPreview::onCommitEaseOut(LLUICtrl* ctrl, void* data) if (!previewp->getEnabled()) return; - LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar(); + LLVOAvatar* avatarp; + if (previewp->mInWorld) + { + if (!gAgent.getAvatarObject()) + { + return; + } + avatarp = gAgent.getAvatarObject(); + } + else + { + if (!previewp->mAnimPreview) + { + return; + } + avatarp = previewp->mAnimPreview->getDummyAvatar(); + } LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID); motionp->setEaseOut((F32)previewp->childGetValue("ease_out_time").asReal()); @@ -815,7 +1057,23 @@ BOOL LLFloaterAnimPreview::validateEaseIn(LLUICtrl* spin, void* data) if (!previewp->getEnabled()) return FALSE; - LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar(); + LLVOAvatar* avatarp; + if (previewp->mInWorld) + { + if (!gAgent.getAvatarObject()) + { + return FALSE; + } + avatarp = gAgent.getAvatarObject(); + } + else + { + if (!previewp->mAnimPreview) + { + return FALSE; + } + avatarp = previewp->mAnimPreview->getDummyAvatar(); + } LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID); if (!motionp->getLoop()) @@ -837,7 +1095,23 @@ BOOL LLFloaterAnimPreview::validateEaseOut(LLUICtrl* spin, void* data) if (!previewp->getEnabled()) return FALSE; - LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar(); + LLVOAvatar* avatarp; + if (previewp->mInWorld) + { + if (!gAgent.getAvatarObject()) + { + return FALSE; + } + avatarp = gAgent.getAvatarObject(); + } + else + { + if (!previewp->mAnimPreview) + { + return FALSE; + } + avatarp = previewp->mAnimPreview->getDummyAvatar(); + } LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID); if (!motionp->getLoop()) @@ -922,9 +1196,20 @@ void LLFloaterAnimPreview::refresh() } else { - childHide("bad_animation_text"); + if (!mInWorld) + { + childHide("bad_animation_text"); + } mPlayButton->setEnabled(TRUE); - LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar(); + LLVOAvatar* avatarp; + if (mInWorld) + { + avatarp = gAgent.getAvatarObject(); + } + else + { + avatarp = mAnimPreview->getDummyAvatar(); + } if (avatarp->isMotionActive(mMotionID)) { mStopButton->setEnabled(TRUE); @@ -957,7 +1242,10 @@ void LLFloaterAnimPreview::refresh() mStopButton->setEnabled(TRUE); // stop also resets, leave enabled. } childEnable("ok_btn"); - mAnimPreview->requestUpdate(); + if (!mInWorld) + { + mAnimPreview->requestUpdate(); + } } } @@ -969,9 +1257,17 @@ void LLFloaterAnimPreview::onBtnOK(void* userdata) LLFloaterAnimPreview* floaterp = (LLFloaterAnimPreview*)userdata; if (!floaterp->getEnabled()) return; - if (floaterp->mAnimPreview) + if ((!floaterp->mInWorld && floaterp->mAnimPreview) || (floaterp->mInWorld && gAgent.getAvatarObject())) { - LLKeyframeMotion* motionp = (LLKeyframeMotion*)floaterp->mAnimPreview->getDummyAvatar()->findMotion(floaterp->mMotionID); + LLKeyframeMotion* motionp; + if (floaterp->mInWorld) + { + motionp = (LLKeyframeMotion*)gAgent.getAvatarObject()->findMotion(floaterp->mMotionID); + } + else + { + motionp = (LLKeyframeMotion*)floaterp->mAnimPreview->getDummyAvatar()->findMotion(floaterp->mMotionID); + } S32 file_size = motionp->getFileSize(); U8* buffer = new U8[file_size]; @@ -1006,7 +1302,15 @@ void LLFloaterAnimPreview::onBtnOK(void* userdata) delete [] buffer; // clear out cache for motion data - floaterp->mAnimPreview->getDummyAvatar()->removeMotion(floaterp->mMotionID); + if (floaterp->mInWorld) + { + gAgent.getAvatarObject()->removeMotion(floaterp->mMotionID); + gAgent.getAvatarObject()->deactivateAllMotions(); + } + else + { + floaterp->mAnimPreview->getDummyAvatar()->removeMotion(floaterp->mMotionID); + } LLKeyframeDataCache::removeKeyframeData(floaterp->mMotionID); } diff --git a/linden/indra/newview/llfloateranimpreview.h b/linden/indra/newview/llfloateranimpreview.h index cc4cca3..1b0de62 100644 --- a/linden/indra/newview/llfloateranimpreview.h +++ b/linden/indra/newview/llfloateranimpreview.h @@ -123,6 +123,7 @@ class LLFloaterAnimPreview : public LLFloaterNameDesc LLAssetID mMotionID; LLTransactionID mTransactionID; BOOL mEnabled; + BOOL mInWorld; LLAnimPauseRequest mPauseRequest; std::map mIDList; 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/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/llfloatercustomize.cpp b/linden/indra/newview/llfloatercustomize.cpp index 7d88a0f..41a1590 100644 --- a/linden/indra/newview/llfloatercustomize.cpp +++ b/linden/indra/newview/llfloatercustomize.cpp @@ -245,6 +245,8 @@ class LLMakeOutfitDialog : public LLModalDialog childSetAction("Save", onSave, this ); childSetAction("Cancel", onCancel, this ); + childSetAction("Check All", onCheckAll, this ); + childSetAction("Uncheck All", onUncheckAll, this ); } BOOL getRenameClothing() @@ -325,6 +327,26 @@ class LLMakeOutfitDialog : public LLModalDialog LLMakeOutfitDialog* self = (LLMakeOutfitDialog*) userdata; self->close(); // destroys this object } + + static void onCheckAll( void* userdata ) + { + LLMakeOutfitDialog* self = (LLMakeOutfitDialog*) userdata; + for( S32 i = 0; i < (S32)(self->mCheckBoxList.size()); i++) + { + std::string name = self->mCheckBoxList[i].first; + if(self->childIsEnabled(name))self->childSetValue(name,TRUE); + } + } + + static void onUncheckAll( void* userdata ) + { + LLMakeOutfitDialog* self = (LLMakeOutfitDialog*) userdata; + for( S32 i = 0; i < (S32)(self->mCheckBoxList.size()); i++) + { + std::string name = self->mCheckBoxList[i].first; + if(self->childIsEnabled(name))self->childSetValue(name,FALSE); + } + } }; ///////////////////////////////////////////////////////////////////// @@ -358,7 +380,9 @@ enum ESubpart { SUBPART_GLOVES, SUBPART_UNDERSHIRT, SUBPART_UNDERPANTS, - SUBPART_SKIRT + SUBPART_SKIRT, + SUBPART_ALPHA, + SUBPART_TATTOO }; struct LLSubpart @@ -387,6 +411,7 @@ class LLPanelEditWearable : public LLPanel, public LLEditMenuHandler void addSubpart(const std::string& name, ESubpart id, LLSubpart* part ); void addTextureDropTarget( LLVOAvatar::ETextureIndex te, const std::string& name, const LLUUID& default_image_id, BOOL allow_no_texture ); + void addInvisibilityCheckbox( LLVOAvatar::ETextureIndex te, const std::string& name); void addColorSwatch( LLVOAvatar::ETextureIndex te, const std::string& name ); const std::string& getLabel() { return LLWearable::typeToTypeLabel( mType ); } @@ -403,6 +428,11 @@ class LLPanelEditWearable : public LLPanel, public LLEditMenuHandler void setUIPermissions(U32 perm_mask, BOOL is_complete); + void hideTextureControls(); + bool textureIsInvisible(LLVOAvatar::ETextureIndex te); + void initPreviousTextureList(); + void initPreviousTextureListEntry(LLVOAvatar::ETextureIndex te); + virtual void setVisible( BOOL visible ); // Inherted methods from LLEditMenuHandler @@ -424,6 +454,7 @@ class LLPanelEditWearable : public LLPanel, public LLEditMenuHandler static void onBtnTakeOffDialog( S32 option, void* userdata ); static void onBtnCreateNew( void* userdata ); static void onTextureCommit( LLUICtrl* ctrl, void* userdata ); + static void onInvisibilityCommit( LLUICtrl* ctrl, void* userdata ); static void onColorCommit( LLUICtrl* ctrl, void* userdata ); static void onCommitSexChange( LLUICtrl*, void* userdata ); static void onSelectAutoWearOption(S32 option, void* data); @@ -434,8 +465,10 @@ class LLPanelEditWearable : public LLPanel, public LLEditMenuHandler EWearableType mType; BOOL mCanTakeOff; std::map mTextureList; + std::map mInvisibilityList; std::map mColorList; std::map mSubpartList; + std::map mPreviousTextureList; ESubpart mCurrentSubpart; LLUndoBuffer* mUndoBuffer; }; @@ -536,10 +569,26 @@ void LLPanelEditWearable::setSubpart( ESubpart subpart ) item = (LLViewerInventoryItem*)gAgent.getWearableInventoryItem(mType); U32 perm_mask = 0x0; BOOL is_complete = FALSE; + bool can_export = false; + bool can_import = false; if(item) { perm_mask = item->getPermissions().getMaskOwner(); is_complete = item->isComplete(); + + if (subpart <= 18) // body parts only + { + can_import = true; + + if (is_complete && + gAgent.getID() == item->getPermissions().getOwner() && + gAgent.getID() == item->getPermissions().getCreator() && + (PERM_ITEM_UNRESTRICTED & + perm_mask) == PERM_ITEM_UNRESTRICTED) + { + can_export = true; + } + } } setUIPermissions(perm_mask, is_complete); BOOL editable = ((perm_mask & PERM_MODIFY) && is_complete) ? TRUE : FALSE; @@ -563,7 +612,8 @@ void LLPanelEditWearable::setSubpart( ESubpart subpart ) } gFloaterCustomize->generateVisualParamHints(NULL, sorted_params); gFloaterCustomize->updateScrollingPanelUI(); - + gFloaterCustomize->childSetEnabled("Export", can_export); + gFloaterCustomize->childSetEnabled("Import", can_import); // Update the camera gMorphView->setCameraTargetJoint( gAgent.getAvatarObject()->getJoint( part->mTargetJoint ) ); @@ -694,6 +744,70 @@ void LLPanelEditWearable::onSelectAutoWearOption(S32 option, void* data) wearable->getPermissions().getMaskNextOwner(), cb); } } + +bool LLPanelEditWearable::textureIsInvisible(LLVOAvatar::ETextureIndex te) +{ + if (gAgent.getWearable(mType)) + { + LLVOAvatar *avatar = gAgent.getAvatarObject(); + if (avatar) + { + const LLTextureEntry* current_te = avatar->getTE(te); + return (current_te && current_te->getID() == IMG_INVISIBLE); + } + } + return false; +} + +void LLPanelEditWearable::addInvisibilityCheckbox(LLVOAvatar::ETextureIndex te, const std::string& name) +{ + childSetCommitCallback(name, LLPanelEditWearable::onInvisibilityCommit, this); + + mInvisibilityList[name] = te; +} + +// static +void LLPanelEditWearable::onInvisibilityCommit(LLUICtrl* ctrl, void* userdata) +{ + LLPanelEditWearable* self = (LLPanelEditWearable*) userdata; + LLCheckBoxCtrl* checkbox_ctrl = (LLCheckBoxCtrl*) ctrl; + LLVOAvatar *avatar = gAgent.getAvatarObject(); + if (!avatar) + { + return; + } + + LLVOAvatar::ETextureIndex te = (LLVOAvatar::ETextureIndex)(self->mInvisibilityList[ctrl->getName()]); + + bool new_invis_state = checkbox_ctrl->get(); + if (new_invis_state) + { + LLViewerImage* image = gImageList.getImage(IMG_INVISIBLE); + const LLTextureEntry* current_te = avatar->getTE(te); + if (current_te) + { + self->mPreviousTextureList[(S32)te] = current_te->getID(); + } + avatar->setLocTexTE(te, image, TRUE); + gAgent.sendAgentSetAppearance(); + } + else + { + // Try to restore previous texture, if any. + LLUUID prev_id = self->mPreviousTextureList[(S32)te]; + if (prev_id.isNull() || (prev_id == IMG_INVISIBLE)) + { + prev_id = LLUUID(gSavedSettings.getString("UIImgDefaultAlphaUUID")); + } + if (prev_id.notNull()) + { + LLViewerImage* image = gImageList.getImage(prev_id); + avatar->setLocTexTE(te, image, TRUE); + gAgent.sendAgentSetAppearance(); + } + } +} + void LLPanelEditWearable::addColorSwatch( LLVOAvatar::ETextureIndex te, const std::string& name ) { childSetCommitCallback(name, LLPanelEditWearable::onColorCommit, this); @@ -721,14 +835,36 @@ void LLPanelEditWearable::onColorCommit( LLUICtrl* ctrl, void* userdata ) // Set the new version avatar->setClothesColor( te, new_color, TRUE ); - gAgent.sendAgentSetAppearance(); LLVisualParamHint::requestHintUpdates(); + gAgent.sendAgentSetAppearance(); } } } +void LLPanelEditWearable::initPreviousTextureList() +{ + initPreviousTextureListEntry(LLVOAvatar::TEX_LOWER_ALPHA); + initPreviousTextureListEntry(LLVOAvatar::TEX_UPPER_ALPHA); + initPreviousTextureListEntry(LLVOAvatar::TEX_HEAD_ALPHA); + initPreviousTextureListEntry(LLVOAvatar::TEX_EYES_ALPHA); + initPreviousTextureListEntry(LLVOAvatar::TEX_LOWER_ALPHA); +} + +void LLPanelEditWearable::initPreviousTextureListEntry(LLVOAvatar::ETextureIndex te) +{ + LLVOAvatar* avatar = gAgent.getAvatarObject(); + if (!avatar) + { + return; + } + const LLTextureEntry* current_te = avatar->getTE(te); + if (current_te) + { + mPreviousTextureList[te] = current_te->getID(); + } +} void LLPanelEditWearable::addTextureDropTarget( LLVOAvatar::ETextureIndex te, const std::string& name, const LLUUID& default_image_id, BOOL allow_no_texture ) { @@ -743,6 +879,19 @@ void LLPanelEditWearable::addTextureDropTarget( LLVOAvatar::ETextureIndex te, co texture_ctrl->setNonImmediateFilterPermMask(PERM_NONE);//PERM_COPY | PERM_TRANSFER); } mTextureList[name] = te; + LLVOAvatar* avatar = gAgent.getAvatarObject(); + if (avatar) + { + LLWearable* wearable = gAgent.getWearable(mType); + if (wearable && mType == WT_ALPHA) + { + const LLTextureEntry* current_te = avatar->getTE(te); + if (current_te) + { + mPreviousTextureList[te] = current_te->getID(); + } + } + } } // static @@ -770,7 +919,16 @@ void LLPanelEditWearable::onTextureCommit( LLUICtrl* ctrl, void* userdata ) { image = gImageList.getImage(IMG_DEFAULT_AVATAR); } - avatar->setLocTexTE( te, image, TRUE ); + self->mTextureList[ctrl->getName()] = te; + if (gAgent.getWearable(self->mType)) + { + avatar->setLocTexTE(te, image, TRUE); + gAgent.sendAgentSetAppearance(); + } + if (self->mType == WT_ALPHA && image->getID() != IMG_INVISIBLE) + { + self->mPreviousTextureList[te] = image->getID(); + } gAgent.sendAgentSetAppearance(); } } @@ -793,6 +951,8 @@ ESubpart LLPanelEditWearable::getDefaultSubpart() case WT_UNDERSHIRT: return SUBPART_UNDERSHIRT; case WT_UNDERPANTS: return SUBPART_UNDERPANTS; case WT_SKIRT: return SUBPART_SKIRT; + case WT_ALPHA: return SUBPART_ALPHA; + case WT_TATTOO: return SUBPART_TATTOO; default: llassert(0); return SUBPART_SHAPE_WHOLE; } @@ -872,16 +1032,7 @@ void LLPanelEditWearable::draw() childSetVisible("title_no_modify", TRUE); childSetTextArg("title_no_modify", "[DESC]", std::string(LLWearable::typeToTypeLabel( mType ))); - for( std::map::iterator iter = mTextureList.begin(); - iter != mTextureList.end(); ++iter ) - { - childSetVisible(iter->first, FALSE ); - } - for( std::map::iterator iter = mColorList.begin(); - iter != mColorList.end(); ++iter ) - { - childSetVisible(iter->first, FALSE ); - } + hideTextureControls(); } else if(has_wearable && !is_complete) { @@ -895,16 +1046,7 @@ void LLPanelEditWearable::draw() childSetVisible("path", TRUE); childSetTextArg("path", "[PATH]", path); - for( std::map::iterator iter = mTextureList.begin(); - iter != mTextureList.end(); ++iter ) - { - childSetVisible(iter->first, FALSE ); - } - for( std::map::iterator iter = mColorList.begin(); - iter != mColorList.end(); ++iter ) - { - childSetVisible(iter->first, FALSE ); - } + hideTextureControls(); } else if(has_wearable && is_modifiable) { @@ -951,6 +1093,20 @@ void LLPanelEditWearable::draw() ctrl->set(avatar->getClothesColor( (LLVOAvatar::ETextureIndex)te_index ) ); } } + + for (std::map::iterator iter = mInvisibilityList.begin(); + iter != mInvisibilityList.end(); ++iter) + { + std::string name = iter->first; + LLVOAvatar::ETextureIndex te = (LLVOAvatar::ETextureIndex)iter->second; + childSetVisible(name, is_copyable && is_modifiable && is_complete); + childSetEnabled(name, is_copyable && is_modifiable && is_complete); + LLCheckBoxCtrl* ctrl = getChild(name); + if (ctrl) + { + ctrl->set(textureIsInvisible(te)); + } + } } else { @@ -958,16 +1114,7 @@ void LLPanelEditWearable::draw() childSetVisible("title_not_worn", TRUE); childSetTextArg("title_not_worn", "[DESC]", std::string(LLWearable::typeToTypeLabel( mType ))); - for( std::map::iterator iter = mTextureList.begin(); - iter != mTextureList.end(); ++iter ) - { - childSetVisible(iter->first, FALSE ); - } - for( std::map::iterator iter = mColorList.begin(); - iter != mColorList.end(); ++iter ) - { - childSetVisible(iter->first, FALSE ); - } + hideTextureControls(); } childSetVisible("icon", has_wearable && is_modifiable); @@ -975,11 +1122,34 @@ void LLPanelEditWearable::draw() LLPanel::draw(); } +void LLPanelEditWearable::hideTextureControls() +{ + for (std::map::iterator iter = mTextureList.begin(); + iter != mTextureList.end(); ++iter) + { + childSetVisible(iter->first, FALSE); + } + for (std::map::iterator iter = mColorList.begin(); + iter != mColorList.end(); ++iter) + { + childSetVisible(iter->first, FALSE); + } + for (std::map::iterator iter = mInvisibilityList.begin(); + iter != mInvisibilityList.end(); ++iter) + { + childSetVisible(iter->first, FALSE); + } +} + void LLPanelEditWearable::setWearable(LLWearable* wearable, U32 perm_mask, BOOL is_complete) { if( wearable ) { setUIPermissions(perm_mask, is_complete); + if (mType == WT_ALPHA) + { + initPreviousTextureList(); + } } mUndoBuffer->flushActions(); } @@ -1089,6 +1259,11 @@ void LLPanelEditWearable::setUIPermissions(U32 perm_mask, BOOL is_complete) { childSetVisible(iter->first, is_modifiable && is_complete ); } + for (std::map::iterator iter = mInvisibilityList.begin(); + iter != mInvisibilityList.end(); ++iter) + { + childSetVisible(iter->first, is_copyable && is_modifiable && is_complete); + } } ///////////////////////////////////////////////////////////////////// @@ -1293,7 +1468,7 @@ void LLScrollingPanelParam::onSliderMoved(LLUICtrl* ctrl, void* userdata) //KOWs avatar height stuff LLVOAvatar* avatar = gAgent.getAvatarObject(); F32 avatar_size = (avatar->mBodySize.mV[VZ]) + (F32)0.17; //mBodySize is actually quite a bit off. - avatar_size += (F32)99; //mBodySize is actually quite a bit off. + //avatar_size += (F32)99; //mBodySize is actually quite a bit off. floater_customize->getChild("HeightText")->setValue(llformat("%.2f", avatar_size) + "m"); floater_customize->getChild("HeightText2")->setValue(llformat("%.2f",llround(avatar_size / 0.3048)) + "'" @@ -1524,7 +1699,7 @@ const std::string& LLFloaterCustomize::getEditGroup() // LLFloaterCustomize // statics -EWearableType LLFloaterCustomize::sCurrentWearableType = WT_SHAPE; +EWearableType LLFloaterCustomize::sCurrentWearableType = WT_INVALID; struct WearablePanelData { @@ -1564,7 +1739,9 @@ LLFloaterCustomize::LLFloaterCustomize() factory_map["Undershirt"] = LLCallbackMap(createWearablePanel, (void*)(new WearablePanelData(this, WT_UNDERSHIRT) ) ); factory_map["Underpants"] = LLCallbackMap(createWearablePanel, (void*)(new WearablePanelData(this, WT_UNDERPANTS) ) ); factory_map["Skirt"] = LLCallbackMap(createWearablePanel, (void*)(new WearablePanelData(this, WT_SKIRT) ) ); - + factory_map["Alpha"] = LLCallbackMap(createWearablePanel, (void*)(new WearablePanelData(this, WT_ALPHA) ) ); + factory_map["Tattoo"] = LLCallbackMap(createWearablePanel, (void*)(new WearablePanelData(this, WT_TATTOO) ) ); + LLUICtrlFactory::getInstance()->buildFloater(this, "floater_customize.xml", &factory_map); } @@ -1575,6 +1752,10 @@ BOOL LLFloaterCustomize::postBuild() childSetAction("Save All", LLFloaterCustomize::onBtnSaveAll, (void*)this); childSetAction("Close", LLFloater::onClickClose, (void*)this); + // reX + childSetAction("Import", LLFloaterCustomize::onBtnImport, (void*)this); + childSetAction("Export", LLFloaterCustomize::onBtnExport, (void*)this); + // Wearable panels initWearablePanels(); @@ -1592,6 +1773,8 @@ BOOL LLFloaterCustomize::postBuild() childSetTabChangeCallback("customize tab container", "Undershirt", onTabChanged, (void*)WT_UNDERSHIRT ); childSetTabChangeCallback("customize tab container", "Underpants", onTabChanged, (void*)WT_UNDERPANTS ); childSetTabChangeCallback("customize tab container", "Skirt", onTabChanged, (void*)WT_SKIRT ); + childSetTabChangeCallback("customize tab container", "Alpha", onTabChanged, (void*)WT_ALPHA ); + childSetTabChangeCallback("customize tab container", "Tattoo", onTabChanged, (void*)WT_TATTOO ); // Remove underwear panels for teens if (gAgent.isTeen()) @@ -1609,12 +1792,18 @@ BOOL LLFloaterCustomize::postBuild() // Scrolling Panel initScrollingPanelList(); - - childShowTab("customize tab container", "Shape", true); return TRUE; } +void LLFloaterCustomize::open() +{ + LLFloater::open(); + // childShowTab depends on gFloaterCustomize being defined and therefore must be called after the constructor. - Nyx + childShowTab("customize tab container", "Shape", true); + setCurrentWearableType(WT_SHAPE); +} + //////////////////////////////////////////////////////////////////////////// // static @@ -1635,6 +1824,131 @@ void LLFloaterCustomize::setCurrentWearableType( EWearableType type ) } } + +// reX: new function +void LLFloaterCustomize::onBtnImport( void* userdata ) +{ + LLFilePicker& file_picker = LLFilePicker::instance(); + if( !file_picker.getOpenFile( LLFilePicker::FFLOAD_XML ) ) + { + // User canceled import. + return; + } + + const std::string filename = file_picker.getFirstFile(); + + FILE* fp = LLFile::fopen(filename, "rb"); + + //char text_buffer[2048]; /* Flawfinder: ignore */ + S32 c; + S32 typ; + S32 count; + S32 param_id=0; + F32 param_weight=0; + S32 fields_read; + + for( S32 i=0; i < WT_COUNT; i++ ) + { + fields_read = fscanf( fp, "type %d\n", &typ); + if( fields_read != 1 ) + { + llwarns << "Bad asset type: early end of file" << llendl; + return; + } + + fields_read = fscanf( fp, "parameters %d\n", &count); + if( fields_read != 1 ) + { + llwarns << "Bad parameters : early end of file" << llendl; + return; + } + for(c=0;csetVisualParamWeight( param_id, param_weight, TRUE); + gAgent.getAvatarObject()->updateVisualParams(); + } + } + + + + fclose(fp); + return; +} + +// reX: new function +void LLFloaterCustomize::onBtnExport( void* userdata ) +{ + LLFilePicker& file_picker = LLFilePicker::instance(); + if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_XML ) ) + { + // User canceled export. + return; + } + + LLViewerInventoryItem* item; + BOOL is_modifiable; + + const std::string filename = file_picker.getFirstFile(); + + FILE* fp = LLFile::fopen(filename, "wb"); + + for( S32 i=0; i < WT_COUNT; i++ ) + { + is_modifiable = FALSE; + LLWearable* old_wearable = gAgent.getWearable((EWearableType)i); + if( old_wearable ) + { + item = (LLViewerInventoryItem*)gAgent.getWearableInventoryItem((EWearableType)i); + if(item) + { + const LLPermissions& perm = item->getPermissions(); + is_modifiable = perm.allowModifyBy(gAgent.getID(), gAgent.getGroupID()); + } + } + if (is_modifiable) + { + old_wearable->FileExportParams(fp); + } + if (!is_modifiable) + { + fprintf( fp, "type %d\n",i); + fprintf( fp, "parameters 0\n"); + } + } + + for( S32 i=0; i < WT_COUNT; i++ ) + { + is_modifiable = FALSE; + LLWearable* old_wearable = gAgent.getWearable((EWearableType)i); + if( old_wearable ) + { + item = (LLViewerInventoryItem*)gAgent.getWearableInventoryItem((EWearableType)i); + if(item) + { + const LLPermissions& perm = item->getPermissions(); + is_modifiable = perm.allowModifyBy(gAgent.getID(), gAgent.getGroupID()); + } + } + if (is_modifiable) + { + old_wearable->FileExportTextures(fp); + } + if (!is_modifiable) + { + fprintf( fp, "type %d\n",i); + fprintf( fp, "textures 0\n"); + } + } + + fclose(fp); +} + // static void LLFloaterCustomize::onBtnSaveAll( void* userdata ) { @@ -2086,6 +2400,66 @@ void LLFloaterCustomize::initWearablePanels() panel->addColorSwatch( LLVOAvatar::TEX_LOWER_UNDERPANTS, "Color/Tint" ); } + + ///////////////////////////////////////// + // Alpha + panel = mWearablePanelList[WT_ALPHA]; + + if (panel) + { + part = new LLSubpart(); + part->mTargetJoint = "mPelvis"; + part->mEditGroup = "alpha"; + part->mTargetOffset.setVec(0.f, 0.f, 0.1f); + part->mCameraOffset.setVec(-2.5f, 0.5f, 0.8f); + panel->addSubpart( LLStringUtil::null, SUBPART_ALPHA, part); + + panel->addTextureDropTarget(LLVOAvatar::TEX_LOWER_ALPHA, "Lower Alpha", + LLUUID(gSavedSettings.getString("UIImgDefaultAlphaUUID")), + TRUE); + panel->addTextureDropTarget(LLVOAvatar::TEX_UPPER_ALPHA, "Upper Alpha", + LLUUID(gSavedSettings.getString("UIImgDefaultAlphaUUID")), + TRUE); + panel->addTextureDropTarget(LLVOAvatar::TEX_HEAD_ALPHA, "Head Alpha", + LLUUID(gSavedSettings.getString("UIImgDefaultAlphaUUID")), + TRUE); + panel->addTextureDropTarget(LLVOAvatar::TEX_EYES_ALPHA, "Eye Alpha", + LLUUID(gSavedSettings.getString("UIImgDefaultAlphaUUID")), + TRUE); + panel->addTextureDropTarget(LLVOAvatar::TEX_HAIR_ALPHA, "Hair Alpha", + LLUUID(gSavedSettings.getString("UIImgDefaultAlphaUUID")), + TRUE); + + panel->addInvisibilityCheckbox(LLVOAvatar::TEX_LOWER_ALPHA, "lower alpha texture invisible"); + panel->addInvisibilityCheckbox(LLVOAvatar::TEX_UPPER_ALPHA, "upper alpha texture invisible"); + panel->addInvisibilityCheckbox(LLVOAvatar::TEX_HEAD_ALPHA, "head alpha texture invisible"); + panel->addInvisibilityCheckbox(LLVOAvatar::TEX_EYES_ALPHA, "eye alpha texture invisible"); + panel->addInvisibilityCheckbox(LLVOAvatar::TEX_HAIR_ALPHA, "hair alpha texture invisible"); + } + + ///////////////////////////////////////// + // Tattoo + panel = mWearablePanelList[WT_TATTOO]; + + if (panel) + { + part = new LLSubpart(); + part->mTargetJoint = "mPelvis"; + part->mEditGroup = "tattoo"; + part->mTargetOffset.setVec(0.f, 0.f, 0.1f); + part->mCameraOffset.setVec(-2.5f, 0.5f, 0.8f); + panel->addSubpart( LLStringUtil::null, SUBPART_TATTOO, part); + + panel->addTextureDropTarget(LLVOAvatar::TEX_LOWER_TATTOO, "Lower Tattoo", + LLUUID::null, + TRUE); + panel->addTextureDropTarget(LLVOAvatar::TEX_UPPER_TATTOO, "Upper Tattoo", + LLUUID::null, + TRUE); + panel->addTextureDropTarget(LLVOAvatar::TEX_HEAD_TATTOO, "Head Tattoo", + LLUUID::null, + TRUE); + } } //////////////////////////////////////////////////////////////////////////// @@ -2118,7 +2492,6 @@ void LLFloaterCustomize::spawnWearableAppearance(EWearableType type) } } - void LLFloaterCustomize::draw() { if( isMinimized() ) @@ -2168,12 +2541,14 @@ BOOL LLFloaterCustomize::isDirty() const return FALSE; } - // static void LLFloaterCustomize::onTabChanged( void* userdata, bool from_click ) { EWearableType wearable_type = (EWearableType) (intptr_t)userdata; - LLFloaterCustomize::setCurrentWearableType( wearable_type ); + if (wearable_type != WT_INVALID) + { + LLFloaterCustomize::setCurrentWearableType(wearable_type); + } } void LLFloaterCustomize::onClose(bool app_quitting) @@ -2183,7 +2558,6 @@ void LLFloaterCustomize::onClose(bool app_quitting) handle_reset_view(); // Calls askToSaveAllIfDirty } - //////////////////////////////////////////////////////////////////////////// const S32 LOWER_BTN_HEIGHT = 18 + 8; @@ -2254,7 +2628,6 @@ void LLFloaterCustomize::updateScrollingPanelList(BOOL allow_modify) } } - void LLFloaterCustomize::askToSaveAllIfDirty( void(*next_step_callback)(BOOL proceed, void* userdata), void* userdata ) { if( isDirty()) @@ -2276,7 +2649,6 @@ void LLFloaterCustomize::askToSaveAllIfDirty( void(*next_step_callback)(BOOL pro } } - // static void LLFloaterCustomize::onSaveAllDialog( S32 option, void* userdata ) { @@ -2480,7 +2852,6 @@ void LLUndoWearable::setWearable( EWearableType type ) } } - void LLUndoWearable::applyUndoRedo() { LLVOAvatar* avatar = gAgent.getAvatarObject(); diff --git a/linden/indra/newview/llfloatercustomize.h b/linden/indra/newview/llfloatercustomize.h index 15fc8f1..4240258 100644 --- a/linden/indra/newview/llfloatercustomize.h +++ b/linden/indra/newview/llfloatercustomize.h @@ -81,6 +81,7 @@ class LLFloaterCustomize : public LLFloater // Inherted methods from LLFloater (and above) virtual void onClose(bool app_quitting); virtual void draw(); + /*virtual*/ void open(); // New methods void clearScrollingPanelList(); @@ -107,6 +108,10 @@ class LLFloaterCustomize : public LLFloater static EWearableType getCurrentWearableType() { return sCurrentWearableType; } // Callbacks + // reX: new function (thx dudes) + static void onBtnImport( void* userdata ); + // reX: new function + static void onBtnExport( void* userdata ); static void onBtnSaveAll( void* userdata ); static void onBtnSnapshot( void* userdata ); static void onBtnMakeOutfit( void* userdata ); 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/llfloaterimagepreview.cpp b/linden/indra/newview/llfloaterimagepreview.cpp index 762451e..1ce8ae4 100644 --- a/linden/indra/newview/llfloaterimagepreview.cpp +++ b/linden/indra/newview/llfloaterimagepreview.cpp @@ -56,6 +56,7 @@ #include "lluictrlfactory.h" #include "llviewerimagelist.h" #include "llstring.h" +#include "llviewercontrol.h" //static S32 LLFloaterImagePreview::sUploadAmount = 10; @@ -116,6 +117,9 @@ BOOL LLFloaterImagePreview::postBuild() if (mRawImagep->getWidth() * mRawImagep->getHeight () <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF) childEnable("lossless_check"); + + gSavedSettings.setBOOL("EmeraldTemporaryUpload",FALSE); + childSetValue("temp_check",FALSE); } else { 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/llfloatersearchreplace.cpp b/linden/indra/newview/llfloatersearchreplace.cpp new file mode 100644 index 0000000..c20954c --- /dev/null +++ b/linden/indra/newview/llfloatersearchreplace.cpp @@ -0,0 +1,146 @@ +/** + * @file llfloatersearchreplace.cpp + * @brief LLFloaterSearchReplace 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$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llcheckboxctrl.h" +#include "llfocusmgr.h" +#include "lluictrlfactory.h" + +#include "llfloatersearchreplace.h" + +const S32 SEARCH_REPLACE_WIDTH = 300; +const S32 SEARCH_REPLACE_HEIGHT = 120; +const std::string SEARCH_REPLACE_TITLE = "Search and Replace"; + +LLFloaterSearchReplace* LLFloaterSearchReplace::sInstance = NULL; + +LLFloaterSearchReplace::LLFloaterSearchReplace() : mEditor(NULL), + LLFloater(std::string("searchreplace"), LLRect(0, 0, SEARCH_REPLACE_WIDTH, SEARCH_REPLACE_HEIGHT), SEARCH_REPLACE_TITLE) +{ + LLUICtrlFactory::getInstance()->buildFloater(this, "floater_search_replace.xml"); +} + +LLFloaterSearchReplace::~LLFloaterSearchReplace() +{ + sInstance = NULL; +} + +void LLFloaterSearchReplace::open() +{ + LLFloater::open(); + + if (mEditor) + { + bool fReadOnly = mEditor->isReadOnly(); + childSetEnabled("replace_label", !fReadOnly); + childSetEnabled("replace_text", !fReadOnly); + childSetEnabled("replace_btn", !fReadOnly); + childSetEnabled("replace_all_btn", !fReadOnly); + } + + childSetFocus("search_text", TRUE); +} + +BOOL LLFloaterSearchReplace::postBuild() +{ + childSetAction("search_btn", onBtnSearch, this); + childSetAction("replace_btn", onBtnReplace, this); + childSetAction("replace_all_btn", onBtnReplaceAll, this); + + setDefaultBtn("search_btn"); + + return TRUE; +} + +void LLFloaterSearchReplace::show(LLTextEditor* editor) +{ + if (!sInstance) + { + sInstance = new LLFloaterSearchReplace(); + } + + if (sInstance && editor) + { + sInstance->mEditor = editor; + + LLFloater* newdependee, *olddependee = sInstance->getDependee(); + LLView* viewp = editor->getParent(); + while (viewp) + { + newdependee = dynamic_cast(viewp); + if (newdependee) + { + if (newdependee != olddependee) + { + if (olddependee) + olddependee->removeDependentFloater(sInstance); + + if (!newdependee->getHost()) + newdependee->addDependentFloater(sInstance); + else + newdependee->getHost()->addDependentFloater(sInstance); + } + break; + } + viewp = viewp->getParent(); + } + + sInstance->open(); + } +} + +void LLFloaterSearchReplace::onBtnSearch(void* userdata) +{ + if (!sInstance || !sInstance->mEditor || !sInstance->getDependee()) + return; + + LLCheckBoxCtrl* caseChk = sInstance->getChild("case_text"); + sInstance->mEditor->selectNext(sInstance->childGetText("search_text"), caseChk->get()); +} + +void LLFloaterSearchReplace::onBtnReplace(void* userdata) +{ + if (!sInstance || !sInstance->mEditor || !sInstance->getDependee()) + return; + + LLCheckBoxCtrl* caseChk = sInstance->getChild("case_text"); + sInstance->mEditor->replaceText(sInstance->childGetText("search_text"), sInstance->childGetText("replace_text"), caseChk->get()); +} + +void LLFloaterSearchReplace::onBtnReplaceAll(void* userdata) +{ + if (!sInstance || !sInstance->mEditor || !sInstance->getDependee()) + return; + + LLCheckBoxCtrl* caseChk = sInstance->getChild("case_text"); + sInstance->mEditor->replaceTextAll(sInstance->childGetText("search_text"), sInstance->childGetText("replace_text"), caseChk->get()); +} diff --git a/linden/indra/newview/llfloatersearchreplace.h b/linden/indra/newview/llfloatersearchreplace.h new file mode 100644 index 0000000..80cc55a --- /dev/null +++ b/linden/indra/newview/llfloatersearchreplace.h @@ -0,0 +1,64 @@ +/** + * @file llfloatersearchreplace.h + * @brief LLFloaterSearchReplace class definition + * + * $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$ + */ + +#ifndef LL_LLFLOATERSEARCHREPLACE_H +#define LL_LLFLOATERSEARCHREPLACE_H + +#include "llfloater.h" +#include "lltexteditor.h" + +class LLFloaterSearchReplace : public LLFloater +{ +private: + LLFloaterSearchReplace(); + virtual ~LLFloaterSearchReplace(); + +public: + virtual void open(); + virtual BOOL postBuild(); + +public: + static void show(LLTextEditor* editor); + + static void onBtnSearch(void* userdata); + static void onBtnReplace(void* userdata); + static void onBtnReplaceAll(void* userdata); + + static LLFloaterSearchReplace* getInstance() { return sInstance; } + +private: + LLTextEditor* mEditor; + + static LLFloaterSearchReplace* sInstance; +}; + +#endif // LL_LLFLOATERSEARCHREPLACE_H 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/llfolderview.cpp b/linden/indra/newview/llfolderview.cpp index 9d59335..e61d48e 100644 --- a/linden/indra/newview/llfolderview.cpp +++ b/linden/indra/newview/llfolderview.cpp @@ -291,6 +291,30 @@ void LLFolderViewItem::refreshFromListener() } mLabelStyle = mListener->getLabelStyle(); mLabelSuffix = mListener->getLabelSuffix(); + + LLInventoryItem* item = gInventory.getItem(mListener->getUUID()); + + std::string desc; + if (item) + { + if (!item->getDescription().empty()) + { + desc = item->getDescription(); + LLStringUtil::toUpper(desc); + } + } + mSearchableLabelDesc = desc; + + std::string creator_name; + if (item) + { + if (item->getCreatorUUID().notNull()) + { + gCacheName->getFullName(item->getCreatorUUID(), creator_name); + LLStringUtil::toUpper(creator_name); + } + } + mSearchableLabelCreator = creator_name; } } @@ -586,9 +610,31 @@ void LLFolderViewItem::rename(const std::string& new_name) } } -const std::string& LLFolderViewItem::getSearchableLabel() const +std::string& LLFolderViewItem::getSearchableLabel() { - return mSearchableLabel; + mSearchable = ""; + U32 flags = mRoot->getSearchType(); + if (flags == 0 || (flags & 1)) + { + mSearchable = mSearchableLabel; + } + if (flags & 2) + { + if (mSearchable.length()) + { + mSearchable += " "; + } + mSearchable += mSearchableLabelDesc; + } + if (flags & 4) + { + if (mSearchable.length()) + { + mSearchable += " "; + } + mSearchable += mSearchableLabelCreator; + } + return mSearchable; } const std::string& LLFolderViewItem::getName( void ) const @@ -946,10 +992,13 @@ void LLFolderViewItem::draw() if (sBoxImage.notNull() && mStringMatchOffset != std::string::npos) { // don't draw backgrounds for zero-length strings + std::string combined_string = mLabel + mLabelSuffix; S32 filter_string_length = mRoot->getFilterSubString().size(); - if (filter_string_length > 0) + std::string combined_string_upper = combined_string; + LLStringUtil::toUpper(combined_string_upper); + if (filter_string_length > 0 && (mRoot->getSearchType() & 1) && + combined_string_upper.find(mRoot->getFilterSubString()) == mStringMatchOffset) { - std::string combined_string = mLabel + mLabelSuffix; S32 left = llround(text_left) + sFont->getWidth(combined_string, 0, mStringMatchOffset) - 1; S32 right = left + sFont->getWidth(combined_string, mStringMatchOffset, filter_string_length) + 2; S32 bottom = llfloor(getRect().getHeight() - sFont->getLineHeight() - 3); @@ -2516,6 +2565,7 @@ LLFolderView::LLFolderView( const std::string& name, LLUIImagePtr root_folder_ic mNeedsAutoRename(FALSE), mDebugFilters(FALSE), mSortOrder(LLInventoryFilter::SO_FOLDERS_BY_NAME), // This gets overridden by a pref immediately + mSearchType(1), mFilter(name), mShowSelectionContext(FALSE), mShowSingleSelection(FALSE), @@ -2645,6 +2695,59 @@ U32 LLFolderView::getSortOrder() const return mSortOrder; } +U32 LLFolderView::toggleSearchType(std::string toggle) +{ + if (toggle == "name") + { + if (mSearchType & 1) + { + mSearchType &= 6; + } + else + { + mSearchType |= 1; + } + } + else if (toggle == "description") + { + if (mSearchType & 2) + { + mSearchType &= 5; + } + else + { + mSearchType |= 2; + } + } + else if (toggle == "creator") + { + if (mSearchType & 4) + { + mSearchType &= 3; + } + else + { + mSearchType |= 4; + } + } + if (mSearchType == 0) + { + mSearchType = 1; + } + + if (getFilterSubString().length()) + { + mFilter.setModified(LLInventoryFilter::FILTER_RESTART); + } + + return mSearchType; +} + +U32 LLFolderView::getSearchType() const +{ + return mSearchType; +} + BOOL LLFolderView::addFolder( LLFolderViewFolder* folder) { // enforce sort order of My Inventory followed by Library @@ -3994,7 +4097,7 @@ BOOL LLFolderView::search(LLFolderViewItem* first_item, const std::string &searc } } - const std::string current_item_label(search_item->getSearchableLabel()); + std::string current_item_label(search_item->getSearchableLabel()); S32 search_string_length = llmin(upper_case_string.size(), current_item_label.size()); if (!current_item_label.compare(0, search_string_length, upper_case_string)) { diff --git a/linden/indra/newview/llfolderview.h b/linden/indra/newview/llfolderview.h index c7204e7..783c830 100644 --- a/linden/indra/newview/llfolderview.h +++ b/linden/indra/newview/llfolderview.h @@ -336,6 +336,9 @@ class LLFolderViewItem : public LLUICtrl std::string mLabel; std::string mSearchableLabel; + std::string mSearchableLabelDesc; + std::string mSearchableLabelCreator; + std::string mSearchable; std::string mType; S32 mLabelWidth; U32 mCreationDate; @@ -462,7 +465,7 @@ class LLFolderViewItem : public LLUICtrl // viewed. This method will ask the viewed object itself. const std::string& getName( void ) const; - const std::string& getSearchableLabel( void ) const; + std::string& getSearchableLabel( void ); // This method returns the label displayed on the view. This // method was primarily added to allow sorting on the folder @@ -755,6 +758,9 @@ class LLFolderView : public LLFolderViewFolder, LLEditMenuHandler BOOL isFilterModified() { return mFilter.isNotDefault(); } BOOL getAllowMultiSelect() { return mAllowMultiSelect; } + U32 toggleSearchType(std::string toggle); + U32 getSearchType() const; + // Close all folders in the view void closeAllFolders(); void openFolder(const std::string& foldername); @@ -914,6 +920,7 @@ class LLFolderView : public LLFolderViewFolder, LLEditMenuHandler BOOL mDebugFilters; U32 mSortOrder; + U32 mSearchType; LLDepthStack mAutoOpenItems; LLFolderViewFolder* mAutoOpenCandidate; LLFrameTimer mAutoOpenTimer; 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/llgivemoney.cpp b/linden/indra/newview/llgivemoney.cpp index 85ff295..8ca257e 100644 --- a/linden/indra/newview/llgivemoney.cpp +++ b/linden/indra/newview/llgivemoney.cpp @@ -146,7 +146,9 @@ LLFloaterPay::LLFloaterPay(const std::string& name, ++i; - childSetVisible("amount text", FALSE); + childSetVisible("amount text", FALSE); + childSetVisible("currency text", FALSE); + std::string last_amount; if(sLastAmount > 0) @@ -206,12 +208,15 @@ void LLFloaterPay::processPayPriceReply(LLMessageSystem* msg, void **userdata) self->childSetVisible("amount", FALSE); self->childSetVisible("pay btn", FALSE); self->childSetVisible("amount text", FALSE); + self->childSetVisible("currency text", FALSE); + } else if (PAY_PRICE_DEFAULT == price) { self->childSetVisible("amount", TRUE); self->childSetVisible("pay btn", TRUE); self->childSetVisible("amount text", TRUE); + self->childSetVisible("currency text", TRUE); } else { @@ -222,6 +227,7 @@ void LLFloaterPay::processPayPriceReply(LLMessageSystem* msg, void **userdata) self->childSetVisible("pay btn", TRUE); self->childSetEnabled("pay btn", TRUE); self->childSetVisible("amount text", TRUE); + self->childSetVisible("currency text", TRUE); self->childSetText("amount", llformat("%d", llabs(price))); } @@ -361,6 +367,7 @@ void LLFloaterPay::payDirectly(money_callback callback, floater->childSetVisible("amount", TRUE); floater->childSetVisible("pay btn", TRUE); floater->childSetVisible("amount text", TRUE); + floater->childSetVisible("currency text", TRUE); floater->childSetVisible("fastpay text",TRUE); for(S32 i=0;iautoRemove(mTargetUUID, LLMuteList::AR_MONEY); 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/llhudeffectlookat.cpp b/linden/indra/newview/llhudeffectlookat.cpp index 3a12dad..f5a6e9e 100644 --- a/linden/indra/newview/llhudeffectlookat.cpp +++ b/linden/indra/newview/llhudeffectlookat.cpp @@ -365,6 +365,11 @@ void LLHUDEffectLookAt::unpackData(LLMessageSystem *mesgsys, S32 blocknum) U8 lookAtTypeUnpacked = 0; htonmemcpy(&lookAtTypeUnpacked, &(packed_data[LOOKAT_TYPE]), MVT_U8, 1); + if (lookAtTypeUnpacked > 10) + { + LL_DEBUGS("LookAt")<< "wrong lookAtTypeUnpacked: " << lookAtTypeUnpacked << LL_ENDL; + lookAtTypeUnpacked = 0; + } mTargetType = (ELookAtType)lookAtTypeUnpacked; if (mTargetType == LOOKAT_TARGET_NONE) 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/llinventoryactions.cpp b/linden/indra/newview/llinventoryactions.cpp index 0bf3ab2..83b4e87 100644 --- a/linden/indra/newview/llinventoryactions.cpp +++ b/linden/indra/newview/llinventoryactions.cpp @@ -416,6 +416,16 @@ void do_create(LLInventoryModel *model, LLInventoryPanel *ptr, std::string type, LLUUID parent_id = self ? self->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); LLFolderBridge::createWearable(parent_id, WT_UNDERPANTS); } + else if ("alpha" == type) + { + LLUUID parent_id = self ? self->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + LLFolderBridge::createWearable(parent_id, WT_ALPHA); + } + else if ("tattoo" == type) + { + LLUUID parent_id = self ? self->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + LLFolderBridge::createWearable(parent_id, WT_TATTOO); + } else if ("shape" == type) { LLUUID parent_id = self ? self->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART); @@ -524,6 +534,19 @@ class LLSetSortBy : public inventory_listener_t } }; +class LLSetSearchType : public inventory_listener_t +{ + bool handleEvent(LLPointer event, const LLSD& userdata) + { + std::string toggle = userdata.asString(); + U32 flags = mPtr->getActivePanel()->getRootFolder()->toggleSearchType(toggle); + mPtr->getControl("Inventory.SearchName")->setValue((BOOL)(flags & 1)); + mPtr->getControl("Inventory.SearchDesc")->setValue((BOOL)(flags & 2)); + mPtr->getControl("Inventory.SearchCreator")->setValue((BOOL)(flags & 4)); + return true; + } +}; + class LLBeginIMSession : public inventory_panel_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) @@ -711,6 +734,8 @@ void init_inventory_actions(LLInventoryView *floater) (new LLShowFilters())->registerListener(floater, "Inventory.ShowFilters"); (new LLResetFilter())->registerListener(floater, "Inventory.ResetFilter"); (new LLSetSortBy())->registerListener(floater, "Inventory.SetSortBy"); + + (new LLSetSearchType())->registerListener(floater, "Inventory.SetSearchType"); } void init_inventory_panel_actions(LLInventoryPanel *panel) diff --git a/linden/indra/newview/llinventorybridge.cpp b/linden/indra/newview/llinventorybridge.cpp index 6d2c9a2..beeda8a 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() @@ -141,6 +145,8 @@ std::string ICON_NAME[ICON_NAME_COUNT] = "inv_item_undershirt.tga", "inv_item_underpants.tga", "inv_item_skirt.tga", + "inv_item_alpha.tga", + "inv_item_tattoo.tga", "inv_item_animation.tga", "inv_item_gesture.tga", @@ -862,9 +868,10 @@ std::string LLItemBridge::getLabelSuffix() const LLInventoryItem* item = getItem(); if(item) { + LLPermissions perm = item->getPermissions(); // it's a bit confusing to put nocopy/nomod/etc on calling cards. if(LLAssetType::AT_CALLINGCARD != item->getType() - && item->getPermissions().getOwner() == gAgent.getID()) + && perm.getOwner() == gAgent.getID()) { BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID()); BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID()); @@ -875,6 +882,7 @@ std::string LLItemBridge::getLabelSuffix() const const char* NO_COPY = " (no copy)"; const char* NO_MOD = " (no modify)"; const char* NO_XFER = " (no transfer)"; + const char* TEMPO = " (temporary)"; const char* scopy; if(copy) scopy = EMPTY; else scopy = NO_COPY; @@ -884,7 +892,10 @@ std::string LLItemBridge::getLabelSuffix() const const char* sxfer; if(xfer) sxfer = EMPTY; else sxfer = NO_XFER; - suffix = llformat("%s%s%s",scopy,smod,sxfer); + const char* stempo; + if(perm.getGroup() == gAgent.getID())stempo = TEMPO; + else stempo = EMPTY; + suffix = llformat("%s%s%s%s",scopy,smod,sxfer,stempo); } } return suffix; @@ -1815,10 +1826,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 +1843,7 @@ void LLFolderBridge::folderOptionsMenu() } mItems.push_back(std::string("Take Off Items")); } +//mk hideContextEntries(*mMenu, mItems, disabled_items); } @@ -1856,7 +1869,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 RestrainedLove, 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 (RestrainedLove), 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 +1958,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); @@ -2088,6 +2130,16 @@ void LLFolderBridge::createNewUnderpants(void* user_data) LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERPANTS); } +void LLFolderBridge::createNewAlpha(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_ALPHA); +} + +void LLFolderBridge::createNewTattoo(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_TATTOO); +} + void LLFolderBridge::createNewShape(void* user_data) { LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHAPE); @@ -2374,6 +2426,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 +2927,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 +3257,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("RestrainedLoveAllowWear")) 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("RestrainedLoveAllowWear")) rez_attachment(item, NULL); + + } + } + else +//mk + rez_attachment(item, NULL); } else if(item && item->isComplete()) { @@ -3246,6 +3337,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 +3399,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 +3486,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("RestrainedLoveAllowWear")) + && 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 +3597,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)) { @@ -4231,7 +4363,19 @@ BOOL LLWearableBridge::isItemRemovable() if(gAgent.isWearingItem(mUUID)) return FALSE; return LLInvFVBridge::isItemRemovable(); } - +//k, all uploadable asset types do not use this characteristic; therefore, we can use it to show temporaryness and not interfere cuz we're awesome like that +LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const +{ + LLPermissions perm = getItem()->getPermissions(); + if(perm.getGroup() == gAgent.getID()) + { + return LLFontGL::ITALIC; + } + else + { + return LLFontGL::NORMAL; + } +} LLFontGL::StyleFlags LLWearableBridge::getLabelStyle() const { if( gAgent.isWearingItem( mUUID ) ) diff --git a/linden/indra/newview/llinventorybridge.h b/linden/indra/newview/llinventorybridge.h index 4b20dcf..e7d3260 100644 --- a/linden/indra/newview/llinventorybridge.h +++ b/linden/indra/newview/llinventorybridge.h @@ -63,6 +63,8 @@ enum EInventoryIcon CLOTHING_UNDERSHIRT_ICON_NAME, CLOTHING_UNDERPANTS_ICON_NAME, CLOTHING_SKIRT_ICON_NAME, + CLOTHING_ALPHA_ICON_NAME, + CLOTHING_TATTOO_ICON_NAME, ANIMATION_ICON_NAME, GESTURE_ICON_NAME, @@ -197,7 +199,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) {} @@ -248,6 +252,8 @@ class LLItemBridge : public LLInvFVBridge virtual BOOL hasChildren() const { return FALSE; } virtual BOOL isUpToDate() const { return TRUE; } + virtual LLFontGL::StyleFlags getLabelStyle() const; + // override for LLInvFVBridge virtual void clearDisplayName() { mDisplayName.clear(); } @@ -312,6 +318,8 @@ class LLFolderBridge : public LLInvFVBridge static void createNewGloves(void* user_data); static void createNewUndershirt(void* user_data); static void createNewUnderpants(void* user_data); + static void createNewAlpha(void* user_data); + static void createNewTattoo(void* user_data); static void createNewShape(void* user_data); static void createNewSkin(void* user_data); static void createNewHair(void* user_data); diff --git a/linden/indra/newview/llinventorymodel.cpp b/linden/indra/newview/llinventorymodel.cpp index 1029a3c..5426e84 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("RestrainedLoveForbidGiveToRLV")) + { + 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("RestrainedLoveForbidGiveToRLV")) + { + 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..a5f3130 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; @@ -490,6 +494,10 @@ void LLInventoryView::init(LLInventoryModel* inventory) addBoolControl("Inventory.FoldersAlwaysByName", sort_folders_by_name ); addBoolControl("Inventory.SystemFoldersToTop", sort_system_folders_to_top ); + addBoolControl("Inventory.SearchName", TRUE); + addBoolControl("Inventory.SearchDesc", FALSE); + addBoolControl("Inventory.SearchCreator", FALSE); + mSavedFolderState = new LLSaveFolderState(); mSavedFolderState->setApply(FALSE); @@ -801,6 +809,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 +877,11 @@ LLInventoryView* LLInventoryView::getActiveInventory() // static void LLInventoryView::toggleVisibility() { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowinv) { + return; + } +//mk S32 count = sActiveViews.count(); if (0 == count) { @@ -1198,6 +1217,12 @@ std::string get_item_icon_name(LLAssetType::EType asset_type, case WT_SKIRT: idx = CLOTHING_SKIRT_ICON_NAME; break; + case WT_ALPHA: + idx = CLOTHING_ALPHA_ICON_NAME; + break; + case WT_TATTOO: + idx = CLOTHING_TATTOO_ICON_NAME; + break; default: // no-op, go with choice above break; 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/lloverlaybar.cpp b/linden/indra/newview/lloverlaybar.cpp index 7b85927..ce1acf9 100644 --- a/linden/indra/newview/lloverlaybar.cpp +++ b/linden/indra/newview/lloverlaybar.cpp @@ -40,7 +40,6 @@ #include "llrender.h" #include "llagent.h" #include "llbutton.h" -#include "llchatbar.h" #include "llfocusmgr.h" #include "llimview.h" #include "llmediaremotectrl.h" @@ -52,7 +51,6 @@ #include "llviewerimagelist.h" #include "llviewermedia.h" #include "llviewermenu.h" // handle_reset_view() -#include "llviewermedia.h" #include "llviewerparcelmedia.h" #include "llviewerparcelmgr.h" #include "lluictrlfactory.h" @@ -70,20 +68,46 @@ LLOverlayBar *gOverlayBar = NULL; extern S32 MENU_BAR_HEIGHT; +//MK +extern BOOL RRenabled; +//mk // // Functions // +//static +void* LLOverlayBar::createMasterRemote(void* userdata) +{ + LLOverlayBar *self = (LLOverlayBar*)userdata; + self->mMasterRemote = new LLMediaRemoteCtrl ( "master_volume", + "volume", + LLRect(), + "panel_master_volume.xml"); + return self->mMasterRemote; +} void* LLOverlayBar::createMediaRemote(void* userdata) { LLOverlayBar *self = (LLOverlayBar*)userdata; - self->mMediaRemote = new LLMediaRemoteCtrl (); + self->mMediaRemote = new LLMediaRemoteCtrl ( "media_remote", + "media", + LLRect(), + "panel_media_remote.xml"); return self->mMediaRemote; } +void* LLOverlayBar::createMusicRemote(void* userdata) +{ + LLOverlayBar *self = (LLOverlayBar*)userdata; + self->mMusicRemote = new LLMediaRemoteCtrl ( "music_remote", + "music", + LLRect(), + "panel_music_remote.xml" ); + return self->mMusicRemote; +} + void* LLOverlayBar::createVoiceRemote(void* userdata) { LLOverlayBar *self = (LLOverlayBar*)userdata; @@ -91,16 +115,16 @@ void* LLOverlayBar::createVoiceRemote(void* userdata) return self->mVoiceRemote; } -void* LLOverlayBar::createChatBar(void* userdata) -{ - gChatBar = new LLChatBar(); - return gChatBar; -} -LLOverlayBar::LLOverlayBar() - : LLPanel(), + + +LLOverlayBar::LLOverlayBar(const std::string& name, const LLRect& rect) + : LLPanel(name, rect, FALSE), // not bordered + mMasterRemote(NULL), + mMusicRemote(NULL), mMediaRemote(NULL), mVoiceRemote(NULL), + mMediaState(STOPPED), mMusicState(STOPPED) { setMouseOpaque(FALSE); @@ -109,26 +133,24 @@ LLOverlayBar::LLOverlayBar() mBuilt = false; LLCallbackMap::map_t factory_map; + factory_map["master_volume"] = LLCallbackMap(LLOverlayBar::createMasterRemote, this); factory_map["media_remote"] = LLCallbackMap(LLOverlayBar::createMediaRemote, this); + factory_map["music_remote"] = LLCallbackMap(LLOverlayBar::createMusicRemote, this); factory_map["voice_remote"] = LLCallbackMap(LLOverlayBar::createVoiceRemote, this); - factory_map["chat_bar"] = LLCallbackMap(LLOverlayBar::createChatBar, this); LLUICtrlFactory::getInstance()->buildPanel(this, "panel_overlaybar.xml", &factory_map); -} - -BOOL LLOverlayBar::postBuild() -{ + childSetAction("IM Received",onClickIMReceived,this); childSetAction("Set Not Busy",onClickSetNotBusy,this); childSetAction("Mouselook",onClickMouselook,this); childSetAction("Stand Up",onClickStandUp,this); - childSetVisible("chat_bar", gSavedSettings.getBOOL("ChatVisible")); setFocusRoot(TRUE); mBuilt = true; + // make overlay bar conform to window size + setRect(rect); layoutButtons(); - return TRUE; } LLOverlayBar::~LLOverlayBar() @@ -149,120 +171,265 @@ void LLOverlayBar::reshape(S32 width, S32 height, BOOL called_from_parent) void LLOverlayBar::layoutButtons() { - LLView* state_buttons_panel = getChildView("state_buttons"); + S32 width = getRect().getWidth(); + if (width > 1024) width = 1024; - if (state_buttons_panel->getVisible()) + S32 count = getChildCount(); + const S32 PAD = gSavedSettings.getS32("StatusBarPad"); + + const S32 num_media_controls = 3; + media_remote_width = mMediaRemote ? mMediaRemote->getRect().getWidth() : 0; + music_remote_width = mMusicRemote ? mMusicRemote->getRect().getWidth() : 0; + voice_remote_width = mVoiceRemote ? mVoiceRemote->getRect().getWidth() : 0; + master_remote_width = mMasterRemote ? mMasterRemote->getRect().getWidth() : 0; + + // total reserved width for all media remotes + const S32 ENDPAD = 8; + S32 remote_total_width = media_remote_width + PAD + music_remote_width + PAD + voice_remote_width + PAD + master_remote_width + ENDPAD; + + // calculate button widths + F32 segment_width = (F32)(width - remote_total_width) / (F32)(count - num_media_controls); + + S32 btn_width = lltrunc(segment_width - PAD); + + // Evenly space all views + LLRect r; + S32 i = 0; + for (child_list_const_iter_t child_iter = getChildList()->begin(); + child_iter != getChildList()->end(); ++child_iter) { - LLViewQuery query; - LLWidgetTypeFilter widget_filter; - query.addPreFilter(LLEnabledFilter::getInstance()); - query.addPreFilter(&widget_filter); + LLView *view = *child_iter; + r = view->getRect(); + r.mLeft = (width) - llround(remote_total_width + (i-num_media_controls+1)*segment_width); + r.mRight = r.mLeft + btn_width; + view->setRect(r); + i++; + } - child_list_t button_list = query(state_buttons_panel); + // Fix up remotes to have constant width because they can't shrink + S32 right = getRect().getWidth() - ENDPAD; + if (mMasterRemote) + { + r = mMasterRemote->getRect(); + r.mRight = right; + r.mLeft = right - master_remote_width; + right = r.mLeft - PAD; + mMasterRemote->setRect(r); + } + if (mMusicRemote) + { + r = mMusicRemote->getRect(); + r.mRight = right; + r.mLeft = right - music_remote_width; + right = r.mLeft - PAD; + mMusicRemote->setRect(r); + } + if (mMediaRemote) + { + r = mMediaRemote->getRect(); + r.mRight = right; + r.mLeft = right - media_remote_width; + right = r.mLeft - PAD; + mMediaRemote->setRect(r); + } + if (mVoiceRemote) + { + r = mVoiceRemote->getRect(); + r.mRight = right; + r.mLeft = right - voice_remote_width; + mVoiceRemote->setRect(r); + } - const S32 MAX_BAR_WIDTH = 600; - S32 bar_width = llclamp(state_buttons_panel->getRect().getWidth(), 0, MAX_BAR_WIDTH); + updateBoundingRect(); +} - // calculate button widths - const S32 MAX_BUTTON_WIDTH = 150; - S32 segment_width = llclamp(lltrunc((F32)(bar_width) / (F32)button_list.size()), 0, MAX_BUTTON_WIDTH); - S32 btn_width = segment_width - gSavedSettings.getS32("StatusBarPad"); +void LLOverlayBar::draw() +{ + // retrieve rounded rect image + LLUIImagePtr imagep = LLUI::getUIImage("rounded_square.tga"); + + if (imagep) + { + const S32 PAD = gSavedSettings.getS32("StatusBarPad"); - // Evenly space all buttons, starting from left - S32 left = 0; - S32 bottom = 1; + gGL.getTexUnit(0)->bind(imagep->getImage()); - for (child_list_reverse_iter_t child_iter = button_list.rbegin(); - child_iter != button_list.rend(); ++child_iter) + // draw rounded rect tabs behind all children + LLRect r; + // focus highlights + LLColor4 color = gColors.getColor("FloaterFocusBorderColor"); + gGL.color4fv(color.mV); + if(gFocusMgr.childHasKeyboardFocus(gBottomPanel)) + { + for (child_list_const_iter_t child_iter = getChildList()->begin(); + child_iter != getChildList()->end(); ++child_iter) + { + LLView *view = *child_iter; + if(view->getEnabled() && view->getVisible()) + { + r = view->getRect(); + gl_segmented_rect_2d_tex(r.mLeft - PAD/3 - 1, + r.mTop + 3, + r.mRight + PAD/3 + 1, + r.mBottom, + imagep->getTextureWidth(), + imagep->getTextureHeight(), + 16, + ROUNDED_RECT_TOP); + } + } + } + + // main tabs + for (child_list_const_iter_t child_iter = getChildList()->begin(); + child_iter != getChildList()->end(); ++child_iter) { LLView *view = *child_iter; - LLRect r = view->getRect(); - r.setOriginAndSize(left, bottom, btn_width, r.getHeight()); - view->setRect(r); - left += segment_width; + if(view->getEnabled() && view->getVisible()) + { + r = view->getRect(); + // draw a nice little pseudo-3D outline + color = gColors.getColor("DefaultShadowDark"); + gGL.color4fv(color.mV); + gl_segmented_rect_2d_tex(r.mLeft - PAD/3 + 1, r.mTop + 2, r.mRight + PAD/3, r.mBottom, + imagep->getTextureWidth(), imagep->getTextureHeight(), 16, ROUNDED_RECT_TOP); + color = gColors.getColor("DefaultHighlightLight"); + gGL.color4fv(color.mV); + gl_segmented_rect_2d_tex(r.mLeft - PAD/3, r.mTop + 2, r.mRight + PAD/3 - 3, r.mBottom, + imagep->getTextureWidth(), imagep->getTextureHeight(), 16, ROUNDED_RECT_TOP); + // here's the main background. Note that it overhangs on the bottom so as to hide the + // focus highlight on the bottom panel, thus producing the illusion that the focus highlight + // continues around the tabs + color = gColors.getColor("FocusBackgroundColor"); + gGL.color4fv(color.mV); + gl_segmented_rect_2d_tex(r.mLeft - PAD/3 + 1, r.mTop + 1, r.mRight + PAD/3 - 1, r.mBottom - 1, + imagep->getTextureWidth(), imagep->getTextureHeight(), 16, ROUNDED_RECT_TOP); + } } } + + // draw children on top + LLPanel::draw(); } // Per-frame updates of visibility void LLOverlayBar::refresh() { - BOOL buttons_changed = FALSE; - BOOL im_received = gIMMgr->getIMReceived(); - LLButton* button = getChild("IM Received"); - if (button && button->getVisible() != im_received) - { - button->setVisible(im_received); - sendChildToFront(button); - moveChildToBackOfTabGroup(button); - buttons_changed = TRUE; - } + childSetVisible("IM Received", im_received); + childSetEnabled("IM Received", im_received); BOOL busy = gAgent.getBusy(); - button = getChild("Set Not Busy"); - if (button && button->getVisible() != busy) - { - button->setVisible(busy); - sendChildToFront(button); - moveChildToBackOfTabGroup(button); - buttons_changed = TRUE; - } + childSetVisible("Set Not Busy", busy); + childSetEnabled("Set Not Busy", busy); + BOOL mouselook_grabbed; mouselook_grabbed = gAgent.isControlGrabbed(CONTROL_ML_LBUTTON_DOWN_INDEX) - || gAgent.isControlGrabbed(CONTROL_ML_LBUTTON_UP_INDEX); - button = getChild("Mouselook"); + || gAgent.isControlGrabbed(CONTROL_ML_LBUTTON_UP_INDEX); - if (button && button->getVisible() != mouselook_grabbed) - { - button->setVisible(mouselook_grabbed); - sendChildToFront(button); - moveChildToBackOfTabGroup(button); - buttons_changed = TRUE; - } + + childSetVisible("Mouselook", mouselook_grabbed); + childSetEnabled("Mouselook", mouselook_grabbed); BOOL sitting = FALSE; if (gAgent.getAvatarObject()) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsUnsit) + { + sitting=FALSE; + } else // sitting = true if agent is sitting +//mk sitting = gAgent.getAvatarObject()->mIsSitting; + childSetVisible("Stand Up", sitting); + childSetEnabled("Stand Up", sitting); + } - button = getChild("Stand Up"); - if (button && button->getVisible() != sitting) + const S32 PAD = gSavedSettings.getS32("StatusBarPad"); + const S32 ENDPAD = 8; + S32 right = getRect().getWidth() - master_remote_width - PAD - ENDPAD; + LLRect r; + + BOOL master_remote = !gSavedSettings.getBOOL("HideMasterRemote"); + + LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); + + if (mMusicRemote && gAudiop) { - button->setVisible(sitting); - sendChildToFront(button); - moveChildToBackOfTabGroup(button); - buttons_changed = TRUE; + if (!parcel + || parcel->getMusicURL().empty() + || !gSavedSettings.getBOOL("AudioStreamingMusic")) + { + mMusicRemote->setVisible(FALSE); + mMusicRemote->setEnabled(FALSE); + } + else + { + mMusicRemote->setEnabled(TRUE); + r = mMusicRemote->getRect(); + r.mRight = right; + r.mLeft = right - music_remote_width; + right = r.mLeft - PAD; + mMusicRemote->setRect(r); + mMusicRemote->setVisible(TRUE); + master_remote = TRUE; + } } + if (mMediaRemote) + { + if (parcel && parcel->getMediaURL()[0] && + gSavedSettings.getBOOL("AudioStreamingVideo")) + { + // display remote control + mMediaRemote->setEnabled(TRUE); + r = mMediaRemote->getRect(); + r.mRight = right; + r.mLeft = right - media_remote_width; + right = r.mLeft - PAD; + mMediaRemote->setRect(r); + mMediaRemote->setVisible(TRUE); + master_remote = TRUE; + } + else + { + mMediaRemote->setVisible(FALSE); + mMediaRemote->setEnabled(FALSE); + } + } + if (mVoiceRemote) + { + if (LLVoiceClient::voiceEnabled()) + { + r = mVoiceRemote->getRect(); + r.mRight = right; + r.mLeft = right - voice_remote_width; + mVoiceRemote->setRect(r); + mVoiceRemote->setVisible(TRUE); + master_remote = TRUE; + } + else + { + mVoiceRemote->setVisible(FALSE); + } + } - moveChildToBackOfTabGroup(mMediaRemote); - moveChildToBackOfTabGroup(mVoiceRemote); + mMasterRemote->setVisible(master_remote); + mMasterRemote->setEnabled(master_remote); // turn off the whole bar in mouselook if (gAgent.cameraMouselook()) { - childSetVisible("media_remote_container", FALSE); - childSetVisible("voice_remote_container", FALSE); - childSetVisible("state_buttons", FALSE); + setVisible(FALSE); } else { - // update "remotes" - childSetVisible("media_remote_container", TRUE); - childSetVisible("voice_remote_container", LLVoiceClient::voiceEnabled()); - childSetVisible("state_buttons", TRUE); + setVisible(TRUE); } - // always let user toggle into and out of chatbar - childSetVisible("chat_bar", gSavedSettings.getBOOL("ChatVisible")); - - if (buttons_changed) - { - layoutButtons(); - } + updateBoundingRect(); } //----------------------------------------------------------------------- @@ -298,89 +465,108 @@ void LLOverlayBar::onClickMouselook(void*) //static void LLOverlayBar::onClickStandUp(void*) { - LLSelectMgr::getInstance()->deselectAllForStandingUp(); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsUnsit) { + if (gAgent.getAvatarObject() && + gAgent.getAvatarObject()->mIsSitting) { + return; + } + } +//mk + LLSelectMgr::getInstance()->deselectAllForStandingUp(); gAgent.setControlFlags(AGENT_CONTROL_STAND_UP); } //////////////////////////////////////////////////////////////////////////////// // static media helpers // *TODO: Move this into an audio manager abstraction + //static -void LLOverlayBar::mediaStop(void*) +void LLOverlayBar::mediaPlay(void*) { if (!gOverlayBar) { return; } - LLViewerParcelMedia::stop(); + gOverlayBar->mMediaState = PLAYING; // desired state + LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); + if (parcel) + { + std::string path(""); + LLViewerParcelMedia::play(parcel); + } } //static -void LLOverlayBar::toggleMediaPlay(void*) +void LLOverlayBar::mediaPause(void*) { if (!gOverlayBar) { return; } - - - if (LLViewerMedia::isMediaPaused()) + gOverlayBar->mMediaState = PAUSED; // desired state + LLViewerParcelMedia::pause(); +} +//static +void LLOverlayBar::mediaStop(void*) +{ + if (!gOverlayBar) { - LLViewerParcelMedia::start(); + return; } - else if(LLViewerMedia::isMediaPlaying()) + gOverlayBar->mMediaState = STOPPED; // desired state + LLViewerParcelMedia::stop(); +} + +//static +void LLOverlayBar::musicPlay(void*) +{ + if (!gOverlayBar) { - LLViewerParcelMedia::pause(); + return; } - else + gOverlayBar->mMusicState = PLAYING; // desired state + if (gAudiop) { LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); - if (parcel) + if ( parcel ) { - LLViewerParcelMedia::play(parcel); + // this doesn't work properly when crossing parcel boundaries - even when the + // stream is stopped, it doesn't return the right thing - commenting out for now. +// if ( gAudiop->isInternetStreamPlaying() == 0 ) + { + gAudiop->startInternetStream(parcel->getMusicURL().c_str()); + } } } } - //static -void LLOverlayBar::toggleMusicPlay(void*) +void LLOverlayBar::musicPause(void*) { if (!gOverlayBar) { return; } - - if (gOverlayBar->mMusicState != PLAYING) + gOverlayBar->mMusicState = PAUSED; // desired state + if (gAudiop) { - gOverlayBar->mMusicState = PLAYING; // desired state - if (gAudiop) - { - LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); - if ( parcel ) - { - // this doesn't work properly when crossing parcel boundaries - even when the - // stream is stopped, it doesn't return the right thing - commenting out for now. - // if ( gAudiop->isInternetStreamPlaying() == 0 ) - { - gAudiop->startInternetStream(parcel->getMusicURL()); - } - } - } + gAudiop->pauseInternetStream(1); } - //else - //{ - // gOverlayBar->mMusicState = PAUSED; // desired state - // if (gAudiop) - // { - // gAudiop->pauseInternetStream(1); - // } - //} - else +} +//static +void LLOverlayBar::musicStop(void*) +{ + if (!gOverlayBar) { - gOverlayBar->mMusicState = STOPPED; // desired state - if (gAudiop) - { - gAudiop->stopInternetStream(); - } + return; + } + gOverlayBar->mMusicState = STOPPED; // desired state + if (gAudiop) + { + gAudiop->stopInternetStream(); } } +void LLOverlayBar::toggleAudioVolumeFloater(void* user_data) +{ + LLFloaterAudioVolume::toggleInstance(LLSD()); +} diff --git a/linden/indra/newview/lloverlaybar.h b/linden/indra/newview/lloverlaybar.h index b4dc096..ffdf341 100644 --- a/linden/indra/newview/lloverlaybar.h +++ b/linden/indra/newview/lloverlaybar.h @@ -54,16 +54,17 @@ class LLOverlayBar : public LLPanel { public: - LLOverlayBar(); + LLOverlayBar(const std::string& name, const LLRect& rect ); ~LLOverlayBar(); /*virtual*/ void refresh(); + /*virtual*/ void draw(); /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); - /*virtual*/ BOOL postBuild(); void layoutButtons(); // helpers for returning desired state + BOOL mediaPlaying() { return mMediaState == PLAYING; } BOOL musicPlaying() { return mMusicState == PLAYING; } static void onClickIMReceived(void* data); @@ -73,27 +74,37 @@ class LLOverlayBar static void onClickResetView(void* data); //static media helper functions - static void toggleMediaPlay(void*); - static void toggleMusicPlay(void*); + static void mediaPlay(void*); + static void mediaPause(void*); + static void mediaStop(void*); + + static void musicPlay(void*); static void musicPause(void*); static void musicStop(void*); - static void mediaStop(void*); static void toggleAudioVolumeFloater(void*); - + protected: + static void* createMasterRemote(void* userdata); + static void* createMusicRemote(void* userdata); static void* createMediaRemote(void* userdata); static void* createVoiceRemote(void* userdata); - static void* createChatBar(void* userdata); - - void enableMediaButtons(); protected: + LLMediaRemoteCtrl* mMasterRemote; + LLMediaRemoteCtrl* mMusicRemote; LLMediaRemoteCtrl* mMediaRemote; LLVoiceRemoteCtrl* mVoiceRemote; bool mBuilt; // dialog constructed yet? enum { STOPPED=0, PLAYING=1, PAUSED=2 }; - S32 mMusicState; + BOOL mMediaState; + BOOL mMusicState; + +private: + S32 media_remote_width; + S32 music_remote_width; + S32 voice_remote_width; + S32 master_remote_width; }; extern LLOverlayBar* gOverlayBar; diff --git a/linden/indra/newview/llpanelaudiovolume.cpp b/linden/indra/newview/llpanelaudiovolume.cpp index fa39f3e..bfe6ac6 100644 --- a/linden/indra/newview/llpanelaudiovolume.cpp +++ b/linden/indra/newview/llpanelaudiovolume.cpp @@ -37,6 +37,55 @@ #include "llviewercontrol.h" #include "lluictrlfactory.h" +//////////////////////////////////////////////////////////////////////////////// +// Floater version of audio panel +// + +//static +void* LLFloaterAudioVolume::createVolumePanel(void* data) +{ + LLPanelAudioVolume* panel = new LLPanelAudioVolume(); + return panel; +} + +LLFloaterAudioVolume::LLFloaterAudioVolume(const LLSD& seed) +{ + mFactoryMap["Volume Panel"] = LLCallbackMap(createVolumePanel, NULL); + LLUICtrlFactory::getInstance()->buildFloater(this, "floater_audio_volume.xml", &getFactoryMap()); + + S32 pos_x = getRect().mLeft; + S32 pos_y = getRect().mBottom; + LLView* volume_panel_view = gOverlayBar->getChild("master_volume"); + if (volume_panel_view) + { + pos_x = volume_panel_view->getRect().mLeft; + pos_y = volume_panel_view->getRect().mTop; + } + + setOrigin(pos_x, pos_y); + gFloaterView->adjustToFitScreen(this, FALSE); +} + +//static +bool LLFloaterAudioVolume::visible(LLFloater* instance, const LLSD& key) +{ + return VisibilityPolicy::visible(instance, key); +} + +//static +void LLFloaterAudioVolume::show(LLFloater* instance, const LLSD& key) +{ + VisibilityPolicy::show(instance, key); + gSavedSettings.setBOOL("ShowAudioVolume", TRUE); +} + +//static +void LLFloaterAudioVolume::hide(LLFloater* instance, const LLSD& key) +{ + VisibilityPolicy::hide(instance, key); + gSavedSettings.setBOOL("ShowAudioVolume", FALSE); +} + //////////////////////////////////////////////////////////////////////////////// // // @@ -46,18 +95,12 @@ LLPanelAudioVolume::LLPanelAudioVolume() BOOL LLPanelAudioVolume::postBuild() { - childSetCommitCallback("System Volume", onCommitVolumeChange); - childSetCommitCallback("Music Volume", onCommitVolumeChange); - childSetCommitCallback("Media Volume", onCommitVolumeChange); - childSetCommitCallback("Voice Volume", onCommitVolumeChange); - childSetCommitCallback("SFX Volume", onCommitVolumeChange); - childSetCommitCallback("UI Volume", onCommitVolumeChange); - childSetCommitCallback("Wind Volume", onCommitVolumeChange); return TRUE; } LLPanelAudioVolume::~LLPanelAudioVolume () { + gSavedSettings.setBOOL("ShowAudioVolume", FALSE); } //////////////////////////////////////////////////////////////////////////////// @@ -65,58 +108,16 @@ LLPanelAudioVolume::~LLPanelAudioVolume () // void LLPanelAudioVolume::draw() { +// LLOverlayBar::enableMusicButtons(this); +// LLOverlayBar::enableMediaButtons(this); BOOL mute = gSavedSettings.getBOOL("MuteAudio"); bool enable = mute ? false : true; + childSetEnabled("System Volume", enable); childSetEnabled("Music Volume", enable); childSetEnabled("Media Volume", enable); childSetEnabled("Voice Volume", enable); childSetEnabled("SFX Volume", enable); childSetEnabled("UI Volume", enable); childSetEnabled("Wind Volume", enable); - - childSetEnabled("mute_music", enable); - childSetEnabled("mute_media", enable); - childSetEnabled("mute_voice", enable); - childSetEnabled("mute_sfx", enable); - childSetEnabled("mute_wind", enable); - childSetEnabled("mute_ui", enable); - LLPanel::draw(); } - -//static -void LLPanelAudioVolume::onCommitVolumeChange(LLUICtrl* ctrl, void* user_data) -{ - // unmute various audio sources when user changes volume - std::string control_name = ctrl->getControlName(); - if (control_name == "AudioLevelMaster") - { - gSavedSettings.setBOOL("MuteAudio", FALSE); - } - else if (control_name == "AudioLevelSFX") - { - gSavedSettings.setBOOL("MuteSounds", FALSE); - } - else if (control_name == "AudioLevelUI") - { - gSavedSettings.setBOOL("MuteUI", FALSE); - } - else if (control_name == "AudioLevelAmbient") - { - gSavedSettings.setBOOL("MuteAmbient", FALSE); - } - else if (control_name == "AudioLevelMusic") - { - gSavedSettings.setBOOL("MuteMusic", FALSE); - } - else if (control_name == "AudioLevelMedia") - { - gSavedSettings.setBOOL("MuteMedia", FALSE); - } - else if (control_name == "AudioLevelVoice") - { - gSavedSettings.setBOOL("MuteVoice", FALSE); - } -} - - diff --git a/linden/indra/newview/llpanelaudiovolume.h b/linden/indra/newview/llpanelaudiovolume.h index 2227747..799ebd2 100644 --- a/linden/indra/newview/llpanelaudiovolume.h +++ b/linden/indra/newview/llpanelaudiovolume.h @@ -35,17 +35,29 @@ #include "llpanel.h" #include "llfloater.h" +class LLFloaterAudioVolume : + public LLUISingleton, + public LLFloater +{ + friend class LLUISingleton >; +public: + LLFloaterAudioVolume(const LLSD& seed); + static void* createVolumePanel(void* data); + + // visibility policy for LLUISingleton + static bool visible(LLFloater* instance, const LLSD& key); + static void show(LLFloater* instance, const LLSD& key); + static void hide(LLFloater* instance, const LLSD& key); +}; + class LLPanelAudioVolume : public LLPanel { public: - LLPanelAudioVolume(); + LLPanelAudioVolume(); virtual ~LLPanelAudioVolume(); virtual BOOL postBuild(); virtual void draw(); - -private: - static void onCommitVolumeChange(LLUICtrl* ctrl, void* user_data); }; #endif diff --git a/linden/indra/newview/llpanelavatar.cpp b/linden/indra/newview/llpanelavatar.cpp index 44f107f..3bac23c 100644 --- a/linden/indra/newview/llpanelavatar.cpp +++ b/linden/indra/newview/llpanelavatar.cpp @@ -89,6 +89,10 @@ BOOL LLPanelAvatar::sAllowFirstLife = FALSE; extern void handle_lure(const LLUUID& invitee); extern void handle_pay_by_id(const LLUUID& payee); +//MK +extern BOOL RRenabled; +//mk + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLDropTarget // @@ -924,6 +928,12 @@ void LLPanelAvatarClassified::processAvatarClassifiedReply(LLMessageSystem* msg, // static void LLPanelAvatarClassified::onClickNew(void* data) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + return; + } +//mk LLPanelAvatarClassified* self = (LLPanelAvatarClassified*)data; gViewerWindow->alertXml("AddClassified",callbackNew,self); @@ -1098,6 +1108,12 @@ void LLPanelAvatarPicks::processAvatarPicksReply(LLMessageSystem* msg, void**) // static void LLPanelAvatarPicks::onClickNew(void* data) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + return; + } +//mk LLPanelAvatarPicks* self = (LLPanelAvatarPicks*)data; LLPanelPick* panel_pick = new LLPanelPick(FALSE); LLTabContainer* tabs = self->getChild("picks tab"); @@ -1579,7 +1595,7 @@ void LLPanelAvatar::onClickAddFriend(void* userdata) LLNameEditor* name_edit = self->mPanelSecondLife->getChild("name"); if (name_edit) { - LLPanelFriends::requestFriendshipDialog(self->getAvatarID(), + LLFloaterFriends::requestFriendshipDialog(self->getAvatarID(), name_edit->getText()); } } diff --git a/linden/indra/newview/llpanelcontents.cpp b/linden/indra/newview/llpanelcontents.cpp index d91790e..b51d78b 100644 --- a/linden/indra/newview/llpanelcontents.cpp +++ b/linden/indra/newview/llpanelcontents.cpp @@ -65,11 +65,17 @@ #include "lltoolmgr.h" #include "lltoolcomp.h" #include "llpanelinventory.h" +//MK +#include "llvoavatar.h" +//mk + // // Imported globals // - +//MK +extern BOOL RRenabled; +//mk // // Globals @@ -160,6 +166,25 @@ void LLPanelContents::onClickNewScript(void *userdata) LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject(children_ok); if(object) { +//MK + if (RRenabled) + { + // can't edit objects that someone is sitting on, + // when prevented from sit-tping + if (gAgent.mRRInterface.contains ("sittp") || gAgent.mRRInterface.mContainsUnsit) + { + if (object->isSeat()) + { + return; + } + } + + if (!gAgent.mRRInterface.canDetach(object)) + { + return; + } + } +//mk LLPermissions perm; perm.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null); perm.initMasks( diff --git a/linden/indra/newview/llpaneldirfind.cpp b/linden/indra/newview/llpaneldirfind.cpp index 148c217..688b8f5 100644 --- a/linden/indra/newview/llpaneldirfind.cpp +++ b/linden/indra/newview/llpaneldirfind.cpp @@ -65,6 +65,10 @@ #include #include +//MK +extern BOOL RRenabled; +//mk + //--------------------------------------------------------------------------- // LLPanelDirFindAll - Google search appliance based search //--------------------------------------------------------------------------- @@ -252,8 +256,14 @@ void LLPanelDirFind::navigateToDefaultPage() } start_url += getSearchURLSuffix(inc_pg, inc_mature, inc_adult); +//MK + if (!RRenabled || !gAgent.mRRInterface.mContainsShowloc) + { +//mk llinfos << "default url: " << start_url << llendl; - +//MK + } +//mk if (mWebBrowser) { mWebBrowser->navigateTo( start_url ); @@ -306,7 +316,14 @@ std::string LLPanelDirFind::buildSearchURL(const std::string& search_text, const } url += getSearchURLSuffix(inc_pg, inc_mature, inc_adult); +//MK + if (!RRenabled || !gAgent.mRRInterface.mContainsShowloc) + { +//mk llinfos << "search url " << url << llendl; +//MK + } +//mk return url; } // static @@ -428,7 +445,10 @@ void LLPanelDirFind::onNavigateComplete( const EventType& eventIn ) void LLPanelDirFind::onLocationChange( const EventType& eventIn ) { - llinfos << eventIn.getStringValue() << llendl; + if (!RRenabled || !gAgent.mRRInterface.mContainsShowloc) + { + llinfos << eventIn.getStringValue() << llendl; + } } //--------------------------------------------------------------------------- diff --git a/linden/indra/newview/llpaneldisplay.cpp b/linden/indra/newview/llpaneldisplay.cpp index d510775..cf65c04 100644 --- a/linden/indra/newview/llpaneldisplay.cpp +++ b/linden/indra/newview/llpaneldisplay.cpp @@ -84,6 +84,10 @@ #include +//MK +extern BOOL RRenabled; +//mk + const F32 MAX_USER_FAR_CLIP = 512.f; const F32 MIN_USER_FAR_CLIP = 64.f; @@ -417,6 +421,21 @@ void LLPanelDisplay::refresh() updateSliderText(mCtrlSkyFactor, mSkyFactorText); refreshEnabledState(); +//MK + // If unable to change windlight settings, make sure the Basic & Advanced + // Shaders checkboxes are ticked and disabled + if (RRenabled && gAgent.mRRInterface.mContainsSetenv) + { + mShaderEnable = TRUE; + mWindLight = TRUE; + gSavedSettings.setBOOL("VertexShaderEnable", mShaderEnable); + gSavedSettings.setBOOL("WindLightUseAtmosShaders", mWindLight); + mCtrlShaderEnable->setValue(mShaderEnable); + mCtrlWindLight->setValue(mWindLight); + mCtrlShaderEnable->setEnabled(FALSE); + mCtrlWindLight->setEnabled(FALSE); + } +//mk } void LLPanelDisplay::refreshEnabledState() diff --git a/linden/indra/newview/llpanelinventory.cpp b/linden/indra/newview/llpanelinventory.cpp index 7dc2669..dc21d4d 100644 --- a/linden/indra/newview/llpanelinventory.cpp +++ b/linden/indra/newview/llpanelinventory.cpp @@ -81,6 +81,12 @@ #include "llviewerwindow.h" #include "llwearable.h" +//MK +#include "llvoavatar.h" + +extern BOOL RRenabled; +//mk + ///---------------------------------------------------------------------------- /// Local function declarations, constants, enums, and typedefs ///---------------------------------------------------------------------------- @@ -367,6 +373,12 @@ BOOL LLTaskInvFVBridge::isItemRenameable() const LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); if(object) { +//MK + if (RRenabled && !gAgent.mRRInterface.canDetach(object)) + { + return FALSE; + } +//mk LLInventoryItem* item; item = (LLInventoryItem*)(object->getInventoryObject(mUUID)); if(item && gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), @@ -413,6 +425,25 @@ BOOL LLTaskInvFVBridge::isItemMovable() BOOL LLTaskInvFVBridge::isItemRemovable() { LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); +//MK + if (RRenabled) + { + // can't edit objects that someone is sitting on, + // when prevented from sit-tping + if (gAgent.mRRInterface.contains ("sittp") || gAgent.mRRInterface.mContainsUnsit) + { + if (object->isSeat()) + { + return FALSE; + } + } + + if (!gAgent.mRRInterface.canDetach(object)) + { + return FALSE; + } + } +//mk if(object && (object->permModify() || object->permYouOwner())) { @@ -902,6 +933,12 @@ LLUIImagePtr LLTaskTextureBridge::getIcon() const void LLTaskTextureBridge::openItem() { +//MK + if (RRenabled && gAgent.mRRInterface.contains ("viewtexture")) + { + return; + } +//mk llinfos << "LLTaskTextureBridge::openItem()" << llendl; if(!LLPreview::show(mUUID)) { @@ -1187,6 +1224,12 @@ LLTaskLSLBridge::LLTaskLSLBridge( void LLTaskLSLBridge::openItem() { +//MK + if (RRenabled && gAgent.mRRInterface.contains ("viewscript")) + { + return; + } +//mk llinfos << "LLTaskLSLBridge::openItem() " << mUUID << llendl; if(LLLiveLSLEditor::show(mUUID, mPanel->getTaskUUID())) { @@ -1303,6 +1346,20 @@ void LLTaskNotecardBridge::openItem() return; } LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); +//MK + if (RRenabled) + { + if (!gAgent.mRRInterface.canDetach(object)) + { + return; + } + + if (gAgent.mRRInterface.contains ("viewnote")) + { + return; + } + } +//mk if(!object || object->isInventoryPending()) { return; diff --git a/linden/indra/newview/llpanelland.cpp b/linden/indra/newview/llpanelland.cpp index 5f5634d..7cc6d34 100644 --- a/linden/indra/newview/llpanelland.cpp +++ b/linden/indra/newview/llpanelland.cpp @@ -48,6 +48,10 @@ LLPanelLandSelectObserver* LLPanelLandInfo::sObserver = NULL; LLPanelLandInfo* LLPanelLandInfo::sInstance = NULL; +//MK +extern BOOL RRenabled; +//mk + class LLPanelLandSelectObserver : public LLParcelObserver { public: @@ -222,6 +226,12 @@ void LLPanelLandInfo::refresh() //static void LLPanelLandInfo::onClickClaim(void*) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + return; + } +//mk LLViewerParcelMgr::getInstance()->startBuyLand(); } @@ -253,5 +263,11 @@ void LLPanelLandInfo::onClickAbout(void*) LLViewerParcelMgr::getInstance()->selectParcelInRectangle(); } +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + return; + } +//mk LLFloaterLand::showInstance(); } diff --git a/linden/indra/newview/llpanellogin.cpp b/linden/indra/newview/llpanellogin.cpp index 32596f8..a1813cc 100644 --- a/linden/indra/newview/llpanellogin.cpp +++ b/linden/indra/newview/llpanellogin.cpp @@ -773,7 +773,10 @@ void LLPanelLogin::refreshLocation( bool force_visible ) if ( ! force_visible ) show_start = gSavedSettings.getBOOL("ShowStartLocation"); - +//MK + if (gSavedSettings.getBOOL("RestrainedLove")) + show_start = FALSE; +//mk sInstance->childSetVisible("start_location_combo", show_start); sInstance->childSetVisible("start_location_text", show_start); @@ -949,7 +952,7 @@ void LLPanelLogin::loadLoginPage() { oStr << "&auto_login=TRUE"; } - if (gSavedSettings.getBOOL("ShowStartLocation")) + if (gSavedSettings.getBOOL("ShowStartLocation") && !gSavedSettings.getBOOL( "RestrainedLove")) { oStr << "&show_start_location=TRUE"; } diff --git a/linden/indra/newview/llpanelobject.cpp b/linden/indra/newview/llpanelobject.cpp index 7a1516a..4b82dd0 100644 --- a/linden/indra/newview/llpanelobject.cpp +++ b/linden/indra/newview/llpanelobject.cpp @@ -65,6 +65,9 @@ #include "llviewerobject.h" #include "llviewerregion.h" #include "llviewerwindow.h" +//MK +#include "llvoavatar.h" +//mk #include "llvovolume.h" #include "llworld.h" #include "pipeline.h" @@ -74,6 +77,10 @@ #include "lldrawpool.h" +//MK +extern BOOL RRenabled; +//mk + // // Constants // @@ -376,6 +383,24 @@ void LLPanelObject::getState( ) enable_rotate = FALSE; } +//MK + LLVOAvatar* avatar = gAgent.getAvatarObject(); + if (RRenabled && + (gAgent.mRRInterface.contains ("sittp") || (gAgent.mRRInterface.mContainsUnsit && avatar && avatar->mIsSitting))) + { + // don't allow modification if someone is sitting on this object and avatar + // is prevented from sit-tping + if (gAgent.getAvatarObject() && gAgent.getAvatarObject()->mIsSitting) + { + if (objectp->getRootEdit()->isSeat ()) + { + enable_move = FALSE; + enable_scale = FALSE; + enable_rotate = FALSE; + } + } + } +//mk LLVector3 vec; if (enable_move) { diff --git a/linden/indra/newview/llpanelpermissions.cpp b/linden/indra/newview/llpanelpermissions.cpp index 879ebd4..2a2072f 100644 --- a/linden/indra/newview/llpanelpermissions.cpp +++ b/linden/indra/newview/llpanelpermissions.cpp @@ -64,6 +64,10 @@ #include "lluictrlfactory.h" #include "roles_constants.h" +//MK +extern BOOL RRenabled; +//mk + ///---------------------------------------------------------------------------- /// Class llpanelpermissions ///---------------------------------------------------------------------------- @@ -331,10 +335,22 @@ void LLPanelPermissions::refresh() } } +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + owner_name = gAgent.mRRInterface.getDummyName (owner_name); + } +//mk childSetText("Owner Name",owner_name); childSetEnabled("Owner Name",TRUE); childSetEnabled("button owner profile",owners_identical && (mOwnerID.notNull() || LLSelectMgr::getInstance()->selectIsGroupOwned())); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + last_owner_name = gAgent.mRRInterface.getDummyName (last_owner_name); + } +//mk childSetEnabled("Last Owner:", TRUE); childSetText("Last Owner Name",last_owner_name); childSetEnabled("Last Owner Name",TRUE); @@ -876,6 +892,12 @@ void LLPanelPermissions::onClickOwner(void *data) } else { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + return; + } +//mk LLFloaterAvatarInfo::showFromObject(self->mOwnerID); } } @@ -886,6 +908,12 @@ void LLPanelPermissions::onClickLastOwner(void *data) if ( self->mLastOwnerID.notNull() ) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + return; + } +//mk LLFloaterAvatarInfo::showFromObject(self->mLastOwnerID); } } diff --git a/linden/indra/newview/llpanelpick.cpp b/linden/indra/newview/llpanelpick.cpp index 480f703..cf90b52 100644 --- a/linden/indra/newview/llpanelpick.cpp +++ b/linden/indra/newview/llpanelpick.cpp @@ -62,6 +62,10 @@ //static std::list LLPanelPick::sAllPanels; +//MK +extern BOOL RRenabled; +//mk + LLPanelPick::LLPanelPick(BOOL top_pick) : LLPanel(std::string("Top Picks Panel")), mTopPick(top_pick), @@ -169,6 +173,12 @@ BOOL LLPanelPick::postBuild() // Fill in some reasonable defaults for a new pick. void LLPanelPick::initNewPick() { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + return; + } +//mk mPickID.generate(); mCreatorID = gAgent.getID(); @@ -455,7 +465,15 @@ void LLPanelPick::onClickLandmark(void* data) // static void LLPanelPick::onClickSet(void* data) { - LLPanelPick* self = (LLPanelPick*)data; +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + // don't allow to set the location while under @showloc, or it appears on the window + return; + } +//mk + + LLPanelPick* self = (LLPanelPick*)data; // Save location for later. self->mPosGlobal = gAgent.getPositionGlobal(); diff --git a/linden/indra/newview/llprefsim.cpp b/linden/indra/newview/llprefsim.cpp index 45d9dd0..d11d29d 100644 --- a/linden/indra/newview/llprefsim.cpp +++ b/linden/indra/newview/llprefsim.cpp @@ -46,6 +46,10 @@ #include "lldirpicker.h" +//MK +extern BOOL RRenabled; +//mk + class LLPrefsIMImpl : public LLPanel { public: @@ -249,6 +253,12 @@ void LLPrefsIMImpl::setPersonalInfo(const std::string& visibility, bool im_via_e childEnable("log_instant_messages"); childEnable("log_chat"); childEnable("busy_response"); +//MK + if (RRenabled && gAgent.mRRInterface.containsWithoutException ("sendim")) + { + childDisable("busy_response"); + } +//mk childEnable("log_instant_messages_timestamp"); childEnable("log_chat_timestamp"); childEnable("log_chat_IM"); diff --git a/linden/indra/newview/llpreview.cpp b/linden/indra/newview/llpreview.cpp index a548467..b57b86b 100644 --- a/linden/indra/newview/llpreview.cpp +++ b/linden/indra/newview/llpreview.cpp @@ -45,6 +45,9 @@ #include "llviewerobject.h" #include "llviewerobjectlist.h" #include "lldbstrings.h" +#include "llfloatersearchreplace.h" +#include "llpreviewnotecard.h" +#include "llpreviewscript.h" #include "llagent.h" #include "llvoavatar.h" #include "llselectmgr.h" @@ -575,6 +578,24 @@ void LLMultiPreview::tabOpen(LLFloater* opened_floater, bool from_click) { opened_preview->loadAsset(); } + + LLFloater* search_floater = LLFloaterSearchReplace::getInstance(); + if (search_floater && search_floater->getDependee() == this) + { + LLPreviewNotecard* notecard_preview; LLPreviewLSL* script_preview; + if ((notecard_preview = dynamic_cast(opened_preview)) != NULL) + { + LLFloaterSearchReplace::show(notecard_preview->getEditor()); + } + else if ((script_preview = dynamic_cast(opened_preview)) != NULL) + { + LLFloaterSearchReplace::show(script_preview->getEditor()); + } + else + { + search_floater->setVisible(FALSE); + } + } } //static diff --git a/linden/indra/newview/llpreviewnotecard.cpp b/linden/indra/newview/llpreviewnotecard.cpp index e7d45dc..5f8f7bd 100644 --- a/linden/indra/newview/llpreviewnotecard.cpp +++ b/linden/indra/newview/llpreviewnotecard.cpp @@ -39,6 +39,7 @@ #include "llassetuploadresponders.h" #include "llviewerwindow.h" #include "llbutton.h" +#include "llfloatersearchreplace.h" #include "llinventorymodel.h" #include "lllineeditor.h" #include "llnotify.h" @@ -145,6 +146,8 @@ LLPreviewNotecard::LLPreviewNotecard(const std::string& name, editor->setHandleEditKeysDirectly(TRUE); } + initMenu(); + gAgent.changeCameraToDefault(); } @@ -214,6 +217,12 @@ BOOL LLPreviewNotecard::handleKeyHere(KEY key, MASK mask) return TRUE; } + if ('F' == key && (mask & MASK_CONTROL) && !(mask & (MASK_SHIFT | MASK_ALT))) + { + LLFloaterSearchReplace::show(getChild("Notecard Editor")); + return TRUE; + } + return LLPreview::handleKeyHere(key, mask); } @@ -650,4 +659,226 @@ void LLPreviewNotecard::reshape(S32 width, S32 height, BOOL called_from_parent) } } +LLTextEditor* LLPreviewNotecard::getEditor() +{ + return getChild("Notecard Editor"); +} + +void LLPreviewNotecard::initMenu() +{ + LLMenuItemCallGL* menuItem = getChild("Undo"); + menuItem->setMenuCallback(onUndoMenu, this); + menuItem->setEnabledCallback(enableUndoMenu); + + menuItem = getChild("Redo"); + menuItem->setMenuCallback(onRedoMenu, this); + menuItem->setEnabledCallback(enableRedoMenu); + + menuItem = getChild("Cut"); + menuItem->setMenuCallback(onCutMenu, this); + menuItem->setEnabledCallback(enableCutMenu); + + menuItem = getChild("Copy"); + menuItem->setMenuCallback(onCopyMenu, this); + menuItem->setEnabledCallback(enableCopyMenu); + + menuItem = getChild("Paste"); + menuItem->setMenuCallback(onPasteMenu, this); + menuItem->setEnabledCallback(enablePasteMenu); + + menuItem = getChild("Select All"); + menuItem->setMenuCallback(onSelectAllMenu, this); + menuItem->setEnabledCallback(enableSelectAllMenu); + + menuItem = getChild("Deselect"); + menuItem->setMenuCallback(onDeselectMenu, this); + menuItem->setEnabledCallback(enableDeselectMenu); + + menuItem = getChild("Search / Replace..."); + menuItem->setMenuCallback(onSearchMenu, this); + menuItem->setEnabledCallback(NULL); +} + +// static +void LLPreviewNotecard::onSearchMenu(void* userdata) +{ + LLPreviewNotecard* self = (LLPreviewNotecard*)userdata; + if (self) + { + LLViewerTextEditor* editor = self->getChild("Notecard Editor"); + if (editor) + { + LLFloaterSearchReplace::show(editor); + } + } +} + +// static +void LLPreviewNotecard::onUndoMenu(void* userdata) +{ + LLPreviewNotecard* self = (LLPreviewNotecard*)userdata; + if (self) + { + LLViewerTextEditor* editor = self->getChild("Notecard Editor"); + if (editor) + { + editor->undo(); + } + } +} + +// static +void LLPreviewNotecard::onRedoMenu(void* userdata) +{ + LLPreviewNotecard* self = (LLPreviewNotecard*)userdata; + if (self) + { + LLViewerTextEditor* editor = self->getChild("Notecard Editor"); + if (editor) + { + editor->redo(); + } + } +} + +// static +void LLPreviewNotecard::onCutMenu(void* userdata) +{ + LLPreviewNotecard* self = (LLPreviewNotecard*)userdata; + if (self) + { + LLViewerTextEditor* editor = self->getChild("Notecard Editor"); + if (editor) + { + editor->cut(); + } + } +} + +// static +void LLPreviewNotecard::onCopyMenu(void* userdata) +{ + LLPreviewNotecard* self = (LLPreviewNotecard*)userdata; + if (self) + { + LLViewerTextEditor* editor = self->getChild("Notecard Editor"); + if (editor) + { + editor->copy(); + } + } +} + +// static +void LLPreviewNotecard::onPasteMenu(void* userdata) +{ + LLPreviewNotecard* self = (LLPreviewNotecard*)userdata; + if (self) + { + LLViewerTextEditor* editor = self->getChild("Notecard Editor"); + if (editor) + { + editor->paste(); + } + } +} + +// static +void LLPreviewNotecard::onSelectAllMenu(void* userdata) +{ + LLPreviewNotecard* self = (LLPreviewNotecard*)userdata; + if (self) + { + LLViewerTextEditor* editor = self->getChild("Notecard Editor"); + if (editor) + { + editor->selectAll(); + } + } +} + +// static +void LLPreviewNotecard::onDeselectMenu(void* userdata) +{ + LLPreviewNotecard* self = (LLPreviewNotecard*)userdata; + if (self) + { + LLViewerTextEditor* editor = self->getChild("Notecard Editor"); + if (editor) + { + editor->deselect(); + } + } +} + +// static +BOOL LLPreviewNotecard::enableUndoMenu(void* userdata) +{ + LLPreviewNotecard* self = (LLPreviewNotecard*)userdata; + if (!self) return FALSE; + LLViewerTextEditor* editor = self->getChild("Notecard Editor"); + if (!editor) return FALSE; + return editor->canUndo(); +} + +// static +BOOL LLPreviewNotecard::enableRedoMenu(void* userdata) +{ + LLPreviewNotecard* self = (LLPreviewNotecard*)userdata; + if (!self) return FALSE; + LLViewerTextEditor* editor = self->getChild("Notecard Editor"); + if (!editor) return FALSE; + return editor->canRedo(); +} + +// static +BOOL LLPreviewNotecard::enableCutMenu(void* userdata) +{ + LLPreviewNotecard* self = (LLPreviewNotecard*)userdata; + if (!self) return FALSE; + LLViewerTextEditor* editor = self->getChild("Notecard Editor"); + if (!editor) return FALSE; + return editor->canCut(); +} + +// static +BOOL LLPreviewNotecard::enableCopyMenu(void* userdata) +{ + LLPreviewNotecard* self = (LLPreviewNotecard*)userdata; + if (!self) return FALSE; + LLViewerTextEditor* editor = self->getChild("Notecard Editor"); + if (!editor) return FALSE; + return editor->canCopy(); +} + +// static +BOOL LLPreviewNotecard::enablePasteMenu(void* userdata) +{ + LLPreviewNotecard* self = (LLPreviewNotecard*)userdata; + if (!self) return FALSE; + LLViewerTextEditor* editor = self->getChild("Notecard Editor"); + if (!editor) return FALSE; + return editor->canPaste(); +} + +// static +BOOL LLPreviewNotecard::enableSelectAllMenu(void* userdata) +{ + LLPreviewNotecard* self = (LLPreviewNotecard*)userdata; + if (!self) return FALSE; + LLViewerTextEditor* editor = self->getChild("Notecard Editor"); + if (!editor) return FALSE; + return editor->canSelectAll(); +} + +// static +BOOL LLPreviewNotecard::enableDeselectMenu(void* userdata) +{ + LLPreviewNotecard* self = (LLPreviewNotecard*)userdata; + if (!self) return FALSE; + LLViewerTextEditor* editor = self->getChild("Notecard Editor"); + if (!editor) return FALSE; + return editor->canDeselect(); +} + // EOF diff --git a/linden/indra/newview/llpreviewnotecard.h b/linden/indra/newview/llpreviewnotecard.h index 17752fa..83d31f2 100644 --- a/linden/indra/newview/llpreviewnotecard.h +++ b/linden/indra/newview/llpreviewnotecard.h @@ -43,6 +43,8 @@ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLViewerTextEditor; +class LLTextEditor; +class LLMenuBarGL; class LLButton; class LLPreviewNotecard : public LLPreview @@ -83,6 +85,8 @@ class LLPreviewNotecard : public LLPreview // asset system. :( void refreshFromInventory(); + LLTextEditor* getEditor(); + protected: virtual void loadAsset(); @@ -105,6 +109,25 @@ class LLPreviewNotecard : public LLPreview virtual const char *getTitleName() const { return "Note"; } + void initMenu(); + + static void onSearchMenu(void* userdata); + static void onUndoMenu(void* userdata); + static void onRedoMenu(void* userdata); + static void onCutMenu(void* userdata); + static void onCopyMenu(void* userdata); + static void onPasteMenu(void* userdata); + static void onSelectAllMenu(void* userdata); + static void onDeselectMenu(void* userdata); + + static BOOL enableUndoMenu(void* userdata); + static BOOL enableRedoMenu(void* userdata); + static BOOL enableCutMenu(void* userdata); + static BOOL enableCopyMenu(void* userdata); + static BOOL enablePasteMenu(void* userdata); + static BOOL enableSelectAllMenu(void* userdata); + static BOOL enableDeselectMenu(void* userdata); + protected: LLViewerTextEditor* mEditor; LLButton* mSaveBtn; diff --git a/linden/indra/newview/llpreviewscript.cpp b/linden/indra/newview/llpreviewscript.cpp index 9c6c006..0d1fce9 100644 --- a/linden/indra/newview/llpreviewscript.cpp +++ b/linden/indra/newview/llpreviewscript.cpp @@ -75,6 +75,7 @@ #include "lldir.h" #include "llcombobox.h" //#include "llfloaterchat.h" +#include "llfloatersearchreplace.h" #include "llviewerstats.h" #include "llviewertexteditor.h" #include "llviewerwindow.h" @@ -87,6 +88,11 @@ #include "llpanelinventory.h" +//MK +#include "llvoavatar.h" + +extern BOOL RRenabled; +//mk const std::string HELLO_LSL = "default\n" @@ -131,10 +137,6 @@ const S32 SCRIPT_MIN_HEIGHT = const S32 MAX_EXPORT_SIZE = 1000; -const S32 SCRIPT_SEARCH_WIDTH = 300; -const S32 SCRIPT_SEARCH_HEIGHT = 120; -const S32 SCRIPT_SEARCH_LABEL_WIDTH = 50; -const S32 SCRIPT_SEARCH_BUTTON_WIDTH = 80; const S32 TEXT_EDIT_COLUMN_HEIGHT = 16; const S32 MAX_HISTORY_COUNT = 10; const F32 LIVE_HELP_REFRESH_TIME = 1.f; @@ -145,147 +147,6 @@ static bool have_script_upload_cap(LLUUID& object_id) return object && (! object->getRegion()->getCapability("UpdateScriptTask").empty()); } -/// --------------------------------------------------------------------------- -/// LLFloaterScriptSearch -/// --------------------------------------------------------------------------- -class LLFloaterScriptSearch : public LLFloater -{ -public: - LLFloaterScriptSearch(std::string title, LLRect rect, LLScriptEdCore* editor_core); - ~LLFloaterScriptSearch(); - - static void show(LLScriptEdCore* editor_core); - static void onBtnSearch(void* userdata); - void handleBtnSearch(); - - static void onBtnReplace(void* userdata); - void handleBtnReplace(); - - static void onBtnReplaceAll(void* userdata); - void handleBtnReplaceAll(); - - LLScriptEdCore* getEditorCore() { return mEditorCore; } - static LLFloaterScriptSearch* getInstance() { return sInstance; } - - void open(); /*Flawfinder: ignore*/ - -private: - - LLScriptEdCore* mEditorCore; - - static LLFloaterScriptSearch* sInstance; -}; - -LLFloaterScriptSearch* LLFloaterScriptSearch::sInstance = NULL; - -LLFloaterScriptSearch::LLFloaterScriptSearch(std::string title, LLRect rect, LLScriptEdCore* editor_core) - : LLFloater("script search",rect,title), mEditorCore(editor_core) -{ - - LLUICtrlFactory::getInstance()->buildFloater(this,"floater_script_search.xml"); - - childSetAction("search_btn", onBtnSearch,this); - childSetAction("replace_btn", onBtnReplace,this); - childSetAction("replace_all_btn", onBtnReplaceAll,this); - - setDefaultBtn("search_btn"); - - if (!getHost()) - { - LLRect curRect = getRect(); - translate(rect.mLeft - curRect.mLeft, rect.mTop - curRect.mTop); - } - - sInstance = this; - - childSetFocus("search_text", TRUE); - - // find floater in which script panel is embedded - LLView* viewp = (LLView*)editor_core; - while(viewp) - { - LLFloater* floaterp = dynamic_cast(viewp); - if (floaterp) - { - floaterp->addDependentFloater(this); - break; - } - viewp = viewp->getParent(); - } -} - -//static -void LLFloaterScriptSearch::show(LLScriptEdCore* editor_core) -{ - if (sInstance && sInstance->mEditorCore && sInstance->mEditorCore != editor_core) - { - sInstance->close(); - delete sInstance; - } - - if (!sInstance) - { - S32 left = 0; - S32 top = 0; - gFloaterView->getNewFloaterPosition(&left,&top); - - // sInstance will be assigned in the constructor. - new LLFloaterScriptSearch("Script Search",LLRect(left,top,left + SCRIPT_SEARCH_WIDTH,top - SCRIPT_SEARCH_HEIGHT),editor_core); - } - - sInstance->open(); /*Flawfinder: ignore*/ -} - -LLFloaterScriptSearch::~LLFloaterScriptSearch() -{ - sInstance = NULL; -} - -// static -void LLFloaterScriptSearch::onBtnSearch(void *userdata) -{ - LLFloaterScriptSearch* self = (LLFloaterScriptSearch*)userdata; - self->handleBtnSearch(); -} - -void LLFloaterScriptSearch::handleBtnSearch() -{ - LLCheckBoxCtrl* caseChk = getChild("case_text"); - mEditorCore->mEditor->selectNext(childGetText("search_text"), caseChk->get()); -} - -// static -void LLFloaterScriptSearch::onBtnReplace(void *userdata) -{ - LLFloaterScriptSearch* self = (LLFloaterScriptSearch*)userdata; - self->handleBtnReplace(); -} - -void LLFloaterScriptSearch::handleBtnReplace() -{ - LLCheckBoxCtrl* caseChk = getChild("case_text"); - mEditorCore->mEditor->replaceText(childGetText("search_text"), childGetText("replace_text"), caseChk->get()); -} - -// static -void LLFloaterScriptSearch::onBtnReplaceAll(void *userdata) -{ - LLFloaterScriptSearch* self = (LLFloaterScriptSearch*)userdata; - self->handleBtnReplaceAll(); -} - -void LLFloaterScriptSearch::handleBtnReplaceAll() -{ - LLCheckBoxCtrl* caseChk = getChild("case_text"); - mEditorCore->mEditor->replaceTextAll(childGetText("search_text"), childGetText("replace_text"), caseChk->get()); -} - -void LLFloaterScriptSearch::open() /*Flawfinder: ignore*/ -{ - LLFloater::open(); /*Flawfinder: ignore*/ - childSetFocus("search_text", TRUE); -} - /// --------------------------------------------------------------------------- /// LLScriptEdCore /// --------------------------------------------------------------------------- @@ -383,14 +244,6 @@ LLScriptEdCore::LLScriptEdCore( LLScriptEdCore::~LLScriptEdCore() { deleteBridges(); - - // If the search window is up for this editor, close it. - LLFloaterScriptSearch* script_search = LLFloaterScriptSearch::getInstance(); - if (script_search && script_search->getEditorCore() == this) - { - script_search->close(); - delete script_search; - } } void LLScriptEdCore::initMenu() @@ -428,6 +281,10 @@ void LLScriptEdCore::initMenu() menuItem->setMenuCallback(onSelectAllMenu, this); menuItem->setEnabledCallback(enableSelectAllMenu); + menuItem = getChild("Deselect"); + menuItem->setMenuCallback(onDeselectMenu, this); + menuItem->setEnabledCallback(enableDeselectMenu); + menuItem = getChild("Search / Replace..."); menuItem->setMenuCallback(onSearchMenu, this); menuItem->setEnabledCallback(NULL); @@ -826,7 +683,10 @@ void LLScriptEdCore::onBtnUndoChanges( void* userdata ) void LLScriptEdCore::onSearchMenu(void* userdata) { LLScriptEdCore* sec = (LLScriptEdCore*)userdata; - LLFloaterScriptSearch::show(sec); + if (sec && sec->mEditor) + { + LLFloaterSearchReplace::show(sec->mEditor); + } } // static @@ -1230,7 +1090,10 @@ void LLPreviewLSL::onSearchReplace(void* userdata) { LLPreviewLSL* self = (LLPreviewLSL*)userdata; LLScriptEdCore* sec = self->mScriptEd; - LLFloaterScriptSearch::show(sec); + if (sec && sec->mEditor) + { + LLFloaterSearchReplace::show(sec->mEditor); + } } // static @@ -1932,6 +1795,13 @@ void LLLiveLSLEditor::onRunningCheckboxClicked( LLUICtrl*, void* userdata ) LLCheckBoxCtrl* runningCheckbox = self->getChild("running"); BOOL running = runningCheckbox->get(); //self->mRunningCheckbox->get(); +//MK + if (RRenabled && !gAgent.mRRInterface.canDetach(object)) + { + runningCheckbox->set(!running); + return; + } +//mk if( object ) { LLMessageSystem* msg = gMessageSystem; @@ -1957,6 +1827,12 @@ void LLLiveLSLEditor::onReset(void *userdata) LLLiveLSLEditor* self = (LLLiveLSLEditor*) userdata; LLViewerObject* object = gObjectList.findObject( self->mObjectID ); +//MK + if (RRenabled && !gAgent.mRRInterface.canDetach(object)) + { + return; + } +//mk if(object) { LLMessageSystem* msg = gMessageSystem; @@ -2038,7 +1914,10 @@ void LLLiveLSLEditor::onSearchReplace(void* userdata) LLLiveLSLEditor* self = (LLLiveLSLEditor*)userdata; LLScriptEdCore* sec = self->mScriptEd; - LLFloaterScriptSearch::show(sec); + if (sec && sec->mEditor) + { + LLFloaterSearchReplace::show(sec->mEditor); + } } struct LLLiveLSLSaveData @@ -2377,7 +2256,17 @@ void LLLiveLSLEditor::onLoad(void* userdata) // static void LLLiveLSLEditor::onSave(void* userdata, BOOL close_after_save) { - LLLiveLSLEditor* self = (LLLiveLSLEditor*)userdata; + LLLiveLSLEditor* self = (LLLiveLSLEditor*) userdata; +//MK + if (RRenabled) + { + LLViewerObject* object = gObjectList.findObject(self->mObjectID); + if (!gAgent.mRRInterface.canDetach(object)) + { + return; + } + } +// mk self->mCloseAfterSave = close_after_save; self->saveIfNeeded(); } diff --git a/linden/indra/newview/llpreviewscript.h b/linden/indra/newview/llpreviewscript.h index 7026482..1d62b44 100644 --- a/linden/indra/newview/llpreviewscript.h +++ b/linden/indra/newview/llpreviewscript.h @@ -49,7 +49,6 @@ class LLScrollListCtrl; class LLViewerObject; struct LLEntryAndEdCore; class LLMenuBarGL; -class LLFloaterScriptSearch; class LLKeywordToken; // Inner, implementation class. LLPreviewScript and LLLiveLSLEditor each own one of these. @@ -58,7 +57,6 @@ class LLScriptEdCore : public LLPanel friend class LLPreviewScript; friend class LLPreviewLSL; friend class LLLiveLSLEditor; - friend class LLFloaterScriptSearch; public: LLScriptEdCore( @@ -188,6 +186,7 @@ class LLPreviewLSL : public LLPreview static void onSaveBytecodeComplete(const LLUUID& asset_uuid, void* user_data, S32 status, LLExtStat ext_status); public: static LLPreviewLSL* getInstance(const LLUUID& uuid); + LLTextEditor* getEditor() { return mScriptEd->mEditor; } protected: static void* createScriptEdPanel(void* userdata); diff --git a/linden/indra/newview/llpreviewtexture.cpp b/linden/indra/newview/llpreviewtexture.cpp index e56fe7d..163982b 100644 --- a/linden/indra/newview/llpreviewtexture.cpp +++ b/linden/indra/newview/llpreviewtexture.cpp @@ -344,6 +344,12 @@ void LLPreviewTexture::saveAs() } // remember the user-approved/edited file name. mSaveFileName = file_picker.getFirstFile(); + std::string filename = mSaveFileName; + LLStringUtil::toLower(filename); + if (filename.find(".tga") != filename.length() - 4) + { + mSaveFileName += ".tga"; + } mLoadingFullImage = TRUE; getWindow()->incBusyCount(); mImage->setLoadedCallback( LLPreviewTexture::onFileLoadedForSave, diff --git a/linden/indra/newview/llselectmgr.cpp b/linden/indra/newview/llselectmgr.cpp index 139c210..2aec964 100644 --- a/linden/indra/newview/llselectmgr.cpp +++ b/linden/indra/newview/llselectmgr.cpp @@ -96,6 +96,10 @@ const S32 MAX_ACTION_QUEUE_SIZE = 20; const S32 MAX_SILS_PER_FRAME = 50; const S32 MAX_OBJECTS_PER_PACKET = 254; +//MK +extern BOOL RRenabled; +//mk + // // Globals // @@ -2671,6 +2675,13 @@ void LLSelectMgr::selectDelete() { continue; } + +//MK + if (RRenabled && obj->isSeat () && gAgent.mRRInterface.mContainsUnsit) + { + continue; + } +//mk deleteable_count++; diff --git a/linden/indra/newview/llspatialpartition.cpp b/linden/indra/newview/llspatialpartition.cpp index 127fca2..25c0012 100644 --- a/linden/indra/newview/llspatialpartition.cpp +++ b/linden/indra/newview/llspatialpartition.cpp @@ -563,8 +563,7 @@ void LLSpatialGroup::rebuildGeom() void LLSpatialPartition::rebuildGeom(LLSpatialGroup* group) { - if (group->changeLOD()) - { + if (!LLPipeline::sSkipUpdate && group->changeLOD()) { group->mLastUpdateDistance = group->mDistance; group->mLastUpdateViewAngle = group->mViewAngle; } diff --git a/linden/indra/newview/llstartup.cpp b/linden/indra/newview/llstartup.cpp index 1c696a4..bca6e96 100644 --- a/linden/indra/newview/llstartup.cpp +++ b/linden/indra/newview/llstartup.cpp @@ -191,6 +191,11 @@ #include "lldxhardware.h" #endif +//MK +BOOL RRenabled = TRUE; +BOOL RRNoSetEnv = FALSE; +//mk + // // exported globals // @@ -357,6 +362,10 @@ bool idle_startup() static bool samename = false; +//MK + RRenabled = gSavedSettings.getBOOL("RestrainedLove"); + RRNoSetEnv = gSavedSettings.getBOOL("RestrainedLoveNoSetEnv"); +//mk // HACK: These are things from the main loop that usually aren't done // until initialization is complete, but need to be done here for things // to work. @@ -945,6 +954,14 @@ bool idle_startup() location_which = START_LOCATION_ID_HOME; } +//MK + if (RRenabled) + { + gSavedSettings.setBOOL("LoginLastLocation", TRUE); + agent_location_id = START_LOCATION_ID_LAST; // always last location (actually ignore list) + location_which = START_LOCATION_ID_LAST; + } +//mk gViewerWindow->getWindow()->setCursor(UI_CURSOR_WAIT); if (!gNoRender) @@ -1043,7 +1060,9 @@ bool idle_startup() display_startup(); std::stringstream start; - if (LLURLSimString::parse()) +//MK + if (!RRenabled && LLURLSimString::parse()) +//mk { // a startup URL was specified std::stringstream unescaped_start; @@ -2264,7 +2283,7 @@ bool idle_startup() gRenderStartTime.reset(); gForegroundTime.reset(); - if (gSavedSettings.getBOOL("FetchInventoryOnLogin")) + if (RRenabled || gSavedSettings.getBOOL("FetchInventoryOnLogin")) { // Fetch inventory in the background gInventory.startBackgroundFetch(); @@ -2492,13 +2511,28 @@ bool idle_startup() } // If we've got a startup URL, dispatch it - LLStartUp::dispatchURL(); +//MK + if (!RRenabled) + { + LLStartUp::dispatchURL(); + } +//mk // Clean up the userauth stuff. LLUserAuth::getInstance()->reset(); LLStartUp::setStartupState( STATE_STARTED ); + if (gSavedSettings.getBOOL("SpeedRez")) + { + // Speed up rezzing if requested. + F32 dist1 = gSavedSettings.getF32("RenderFarClip"); + F32 dist2 = gSavedSettings.getF32("SavedRenderFarClip"); + gSavedDrawDistance = (dist1 >= dist2 ? dist1 : dist2); + gSavedSettings.setF32("SavedRenderFarClip", gSavedDrawDistance); + gSavedSettings.setF32("RenderFarClip", 32.0f); + } + // Unmute audio if desired and setup volumes. // Unmute audio if desired and setup volumes. // This is a not-uncommon crash site, so surround it with @@ -2913,7 +2947,9 @@ void update_dialog_callback(S32 option, void *userdata) } // if a sim name was passed in via command line parameter (typically through a SLURL) - if ( LLURLSimString::sInstance.mSimString.length() ) +//MK + if (!RRenabled && LLURLSimString::sInstance.mSimString.length()) +//mk { // record the location to start at next time gSavedSettings.setString( "NextLoginLocation", LLURLSimString::sInstance.mSimString ); @@ -2928,7 +2964,9 @@ void update_dialog_callback(S32 option, void *userdata) #elif LL_DARWIN // if a sim name was passed in via command line parameter (typically through a SLURL) - if ( LLURLSimString::sInstance.mSimString.length() ) +//MK + if (!RRenabled && LLURLSimString::sInstance.mSimString.length()) +//mk { // record the location to start at next time gSavedSettings.setString( "NextLoginLocation", LLURLSimString::sInstance.mSimString ); diff --git a/linden/indra/newview/llstatusbar.cpp b/linden/indra/newview/llstatusbar.cpp index fba7cf3..21fa72c 100644 --- a/linden/indra/newview/llstatusbar.cpp +++ b/linden/indra/newview/llstatusbar.cpp @@ -89,6 +89,9 @@ LLStatusBar *gStatusBar = NULL; S32 STATUS_BAR_HEIGHT = 0; extern S32 MENU_BAR_HEIGHT; +//MK +extern BOOL RRenabled; +//mk // TODO: these values ought to be in the XML too @@ -137,7 +140,14 @@ mSquareMetersCommitted(0) mBalanceTimer = new LLFrameTimer(); mHealthTimer = new LLFrameTimer(); - LLUICtrlFactory::getInstance()->buildPanel(this,"panel_status_bar.xml"); + if (gSavedSettings.getBOOL("UseOldStatusBarIcons")) + { + LLUICtrlFactory::getInstance()->buildPanel(this,"panel_status_bar2.xml"); + } + else + { + LLUICtrlFactory::getInstance()->buildPanel(this,"panel_status_bar.xml"); + } // status bar can never get a tab setFocusRoot(FALSE); @@ -184,7 +194,7 @@ mSquareMetersCommitted(0) mSGBandwidth->setLabel(bandwidth_tooltip.getString()); mSGBandwidth->setUnits("Kbps"); mSGBandwidth->setPrecision(0); - mSGBandwidth->setMouseOpaque(FALSE); +// mSGBandwidth->setMouseOpaque(FALSE); addChild(mSGBandwidth); x -= SIM_STAT_WIDTH + 2; @@ -202,7 +212,7 @@ mSquareMetersCommitted(0) mSGPacketLoss->setThreshold(1, 1.f); mSGPacketLoss->setThreshold(2, 3.f); mSGPacketLoss->setPrecision(1); - mSGPacketLoss->setMouseOpaque(FALSE); +// mSGPacketLoss->setMouseOpaque(FALSE); mSGPacketLoss->mPerSec = FALSE; addChild(mSGPacketLoss); @@ -552,6 +562,13 @@ void LLStatusBar::refresh() mRegionDetails.mOwner = "Unknown"; mRegionDetails.mTraffic = 0.0f; } +//MK + gAgent.mRRInterface.setParcelName (mRegionDetails.mParcelName); + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + location_name = "(Hidden) (" + region->getSimAccessString() + ")"; + } +//mk mTextParcelName->setText(location_name); @@ -563,23 +580,26 @@ void LLStatusBar::refresh() // finally adjust parcel name rect S32 new_right = getRect().getWidth(); + + childGetRect("stat_btn", r); + r.translate( new_right - r.mRight, 0); + childSetRect("stat_btn", r); + new_right -= r.getWidth() + 12; + if (search_visible) { + childGetRect("menubar_search_bevel_bg", r); + r.translate( new_right - r.mRight, 0); + childSetRect("menubar_search_bevel_bg", r); + childGetRect("search_btn", r); - //r.translate( new_right - r.mRight, 0); - //childSetRect("search_btn", r); + r.translate( new_right - r.mRight, 0); + childSetRect("search_btn", r); new_right -= r.getWidth(); childGetRect("search_editor", r); - //r.translate( new_right - r.mRight, 0); - //childSetRect("search_editor", r); - new_right -= r.getWidth() + 6; - } - else - { - childGetRect("stat_btn", r); r.translate( new_right - r.mRight, 0); - childSetRect("stat_btn", r); + childSetRect("search_editor", r); new_right -= r.getWidth() + 6; } @@ -612,9 +632,9 @@ void LLStatusBar::refresh() childSetVisible("search_editor", search_visible); childSetVisible("search_btn", search_visible); childSetVisible("menubar_search_bevel_bg", search_visible); - mSGBandwidth->setVisible(! search_visible); - mSGPacketLoss->setVisible(! search_visible); - childSetEnabled("stat_btn", ! search_visible); + mSGBandwidth->setVisible(TRUE); + mSGPacketLoss->setVisible(TRUE); + childSetEnabled("stat_btn", TRUE); } void LLStatusBar::setVisibleForMouselook(bool visible) @@ -737,6 +757,12 @@ static void onClickParcelInfo(void* data) { LLViewerParcelMgr::getInstance()->selectParcelAt(gAgent.getPositionGlobal()); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + return; + } +//mk LLFloaterLand::showInstance(); } @@ -799,6 +825,12 @@ static void onClickScripts(void*) static void onClickBuyLand(void*) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + return; + } +//mk LLViewerParcelMgr::getInstance()->selectParcelAt(gAgent.getPositionGlobal()); LLViewerParcelMgr::getInstance()->startBuyLand(); } diff --git a/linden/indra/newview/lltexlayer.cpp b/linden/indra/newview/lltexlayer.cpp index 0944d4b..7ff9e05 100644 --- a/linden/indra/newview/lltexlayer.cpp +++ b/linden/indra/newview/lltexlayer.cpp @@ -56,22 +56,25 @@ //#include "../tools/imdebug/imdebug.h" - // SJB: We really always want to use the GL cache; // let GL page textures in and out of video RAM instead of trying to do so by hand. // static S32 LLTexLayerSetBuffer::sGLByteCount = 0; -S32 LLTexLayerSetBuffer::sGLBumpByteCount = 0; //----------------------------------------------------------------------------- // LLBakedUploadData() //----------------------------------------------------------------------------- -LLBakedUploadData::LLBakedUploadData( LLVOAvatar* avatar, LLTexLayerSetBuffer* layerset_buffer ) : - mAvatar( avatar ), - mLayerSetBuffer( layerset_buffer ) +LLBakedUploadData::LLBakedUploadData(LLVOAvatar* avatar, + LLTexLayerSet* layerset, + LLTexLayerSetBuffer* layerset_buffer, + const LLUUID & id) : + mAvatar(avatar), + mLayerSet(layerset), + mLayerSetBuffer(layerset_buffer), + mID(id) { - mID.generate(); + mStartTime = LLFrameTimer::getTotalTime(); // Record starting time for( S32 i = 0; i < WT_COUNT; i++ ) { LLWearable* wearable = gAgent.getWearable( (EWearableType)i); @@ -86,7 +89,7 @@ LLBakedUploadData::LLBakedUploadData( LLVOAvatar* avatar, LLTexLayerSetBuffer* l // LLTexLayerSetBuffer // The composite image that a LLTexLayerSet writes to. Each LLTexLayerSet has one. //----------------------------------------------------------------------------- -LLTexLayerSetBuffer::LLTexLayerSetBuffer( LLTexLayerSet* owner, S32 width, S32 height, BOOL has_bump ) +LLTexLayerSetBuffer::LLTexLayerSetBuffer(LLTexLayerSet* owner, S32 width, S32 height) : // ORDER_LAST => must render these after the hints are created. LLDynamicTexture( width, height, 4, LLDynamicTexture::ORDER_LAST, TRUE ), @@ -96,78 +99,39 @@ LLTexLayerSetBuffer::LLTexLayerSetBuffer( LLTexLayerSet* owner, S32 width, S32 h mTexLayerSet( owner ) { LLTexLayerSetBuffer::sGLByteCount += getSize(); - mHasBump = has_bump ; - mBumpTex = NULL ; - - createBumpTexture() ; } LLTexLayerSetBuffer::~LLTexLayerSetBuffer() { LLTexLayerSetBuffer::sGLByteCount -= getSize(); - - if( mBumpTex.notNull()) + destroyGLTexture(); + for (S32 order = 0; order < ORDER_COUNT; order++) + { + LLDynamicTexture::sInstances[order].erase(this); // will fail in all but one case. + } + if (mTexLayerSet->mComposite == this) { - mBumpTex = NULL ; - LLImageGL::sGlobalTextureMemory -= mWidth * mHeight * 4; - LLTexLayerSetBuffer::sGLBumpByteCount -= mWidth * mHeight * 4; + // Destroy the pointer on this now gone buffer. + mTexLayerSet->mComposite = NULL; } } + //virtual void LLTexLayerSetBuffer::restoreGLTexture() { - createBumpTexture() ; LLDynamicTexture::restoreGLTexture() ; } //virtual void LLTexLayerSetBuffer::destroyGLTexture() { - if( mBumpTex.notNull() ) - { - mBumpTex = NULL ; - LLImageGL::sGlobalTextureMemory -= mWidth * mHeight * 4; - LLTexLayerSetBuffer::sGLBumpByteCount -= mWidth * mHeight * 4; - } - LLDynamicTexture::destroyGLTexture() ; } -void LLTexLayerSetBuffer::createBumpTexture() -{ - if( mHasBump ) - { - LLGLSUIDefault gls_ui; - mBumpTex = new LLImageGL(FALSE) ; - if(!mBumpTex->createGLTexture()) - { - mBumpTex = NULL ; - return ; - } - - gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mBumpTex->getTexName()); - stop_glerror(); - - gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, mWidth, mHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); - stop_glerror(); - - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - - LLImageGL::sGlobalTextureMemory += mWidth * mHeight * 4; - LLTexLayerSetBuffer::sGLBumpByteCount += mWidth * mHeight * 4; - } -} - // static void LLTexLayerSetBuffer::dumpTotalByteCount() { llinfos << "Composite System GL Buffers: " << (LLTexLayerSetBuffer::sGLByteCount/1024) << "KB" << llendl; - llinfos << "Composite System GL Bump Buffers: " << (LLTexLayerSetBuffer::sGLBumpByteCount/1024) << "KB" << llendl; } void LLTexLayerSetBuffer::requestUpdate() @@ -221,8 +185,8 @@ void LLTexLayerSetBuffer::popProjection() BOOL LLTexLayerSetBuffer::needsRender() { LLVOAvatar* avatar = mTexLayerSet->getAvatar(); - BOOL upload_now = mNeedsUpload && mTexLayerSet->isLocalTextureDataFinal(); - BOOL needs_update = gAgent.mNumPendingQueries == 0 && (mNeedsUpdate || upload_now) && !avatar->mAppearanceAnimating; + BOOL upload_now = mNeedsUpload && mTexLayerSet->isLocalTextureDataFinal() && gAgent.mNumPendingQueries == 0; + BOOL needs_update = (mNeedsUpdate || upload_now) && !avatar->mAppearanceAnimating; if (needs_update) { BOOL invalid_skirt = avatar->getBakedTE(mTexLayerSet) == LLVOAvatar::TEX_SKIRT_BAKED && !avatar->isWearingWearableType(WT_SKIRT); @@ -260,8 +224,6 @@ void LLTexLayerSetBuffer::postRender(BOOL success) BOOL LLTexLayerSetBuffer::render() { - U8* baked_bump_data = NULL; - // Default color mask for tex layer render gGL.setColorMask(true, true); @@ -270,34 +232,6 @@ BOOL LLTexLayerSetBuffer::render() BOOL upload_now = (gAgent.mNumPendingQueries == 0 && mNeedsUpload && mTexLayerSet->isLocalTextureDataFinal()); BOOL success = TRUE; - // Composite bump - if( mBumpTex.notNull() ) - { - // Composite the bump data - success &= mTexLayerSet->renderBump( mOrigin.mX, mOrigin.mY, mWidth, mHeight ); - stop_glerror(); - - if (success) - { - LLGLSUIDefault gls_ui; - - // read back into texture (this is done externally for the color data) - gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mBumpTex->getTexName()); - stop_glerror(); - - glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, mOrigin.mX, mOrigin.mY, mWidth, mHeight); - stop_glerror(); - - // if we need to upload the data, read it back into a buffer - if( upload_now ) - { - baked_bump_data = new U8[ mWidth * mHeight * 4 ]; - glReadPixels(mOrigin.mX, mOrigin.mY, mWidth, mHeight, GL_RGBA, GL_UNSIGNED_BYTE, baked_bump_data ); - stop_glerror(); - } - } - } - // Composite the color data LLGLSUIDefault gls_ui; success &= mTexLayerSet->render( mOrigin.mX, mOrigin.mY, mWidth, mHeight ); @@ -307,13 +241,26 @@ BOOL LLTexLayerSetBuffer::render() { if (!success) { - delete [] baked_bump_data; llinfos << "Failed attempt to bake " << mTexLayerSet->getBodyRegion() << llendl; mUploadPending = FALSE; } else { - readBackAndUpload(baked_bump_data); + if (mTexLayerSet->isVisible()) + { + readBackAndUpload(); + } + else + { + mUploadPending = FALSE; + mNeedsUpload = FALSE; + LLVOAvatar* avatar = mTexLayerSet->getAvatar(); + if (avatar) + { + avatar->setNewBakedTexture(avatar->getBakedTE(mTexLayerSet), IMG_INVISIBLE); + llinfos << "Invisible baked texture set for " << mTexLayerSet->getBodyRegion() << llendl; + } + } } } @@ -348,7 +295,7 @@ BOOL LLTexLayerSetBuffer::updateImmediate() return result; } -void LLTexLayerSetBuffer::readBackAndUpload(U8* baked_bump_data) +void LLTexLayerSetBuffer::readBackAndUpload() { // pointers for storing data to upload U8* baked_color_data = new U8[ mWidth * mHeight * 4 ]; @@ -378,79 +325,23 @@ void LLTexLayerSetBuffer::readBackAndUpload(U8* baked_bump_data) // writes into baked_color_data const char* comment_text = NULL; - S32 baked_image_components = mBumpTex.notNull() ? 5 : 4; // red green blue [bump] clothing + S32 baked_image_components = 5; // red green blue bump clothing LLPointer baked_image = new LLImageRaw( mWidth, mHeight, baked_image_components ); U8* baked_image_data = baked_image->getData(); - if( mBumpTex.notNull() ) - { - comment_text = LINDEN_J2C_COMMENT_PREFIX "RGBHM"; // 5 channels: rgb, heightfield/alpha, mask + comment_text = LINDEN_J2C_COMMENT_PREFIX "RGBHM"; // 5 channels: rgb, heightfield/alpha, mask - // Hide the alpha for the eyelashes in a corner of the bump map - if (mTexLayerSet->getBodyRegion() == "head") - { - S32 i = 0; - for( S32 u = 0; u < mWidth; u++ ) - { - for( S32 v = 0; v < mHeight; v++ ) - { - baked_image_data[5*i + 0] = baked_color_data[4*i + 0]; - baked_image_data[5*i + 1] = baked_color_data[4*i + 1]; - baked_image_data[5*i + 2] = baked_color_data[4*i + 2]; - baked_image_data[5*i + 3] = baked_color_data[4*i + 3] < 255 ? baked_color_data[4*i + 3] : baked_bump_data[4*i]; - baked_image_data[5*i + 4] = baked_mask_data[i]; - i++; - } - } - } - else - { - S32 i = 0; - for( S32 u = 0; u < mWidth; u++ ) - { - for( S32 v = 0; v < mHeight; v++ ) - { - baked_image_data[5*i + 0] = baked_color_data[4*i + 0]; - baked_image_data[5*i + 1] = baked_color_data[4*i + 1]; - baked_image_data[5*i + 2] = baked_color_data[4*i + 2]; - baked_image_data[5*i + 3] = baked_bump_data[4*i]; - baked_image_data[5*i + 4] = baked_mask_data[i]; - i++; - } - } - } - } - else - { - if (mTexLayerSet->getBodyRegion() == "skirt") - { - S32 i = 0; - for( S32 u = 0; u < mWidth; u++ ) - { - for( S32 v = 0; v < mHeight; v++ ) - { - baked_image_data[4*i + 0] = baked_color_data[4*i + 0]; - baked_image_data[4*i + 1] = baked_color_data[4*i + 1]; - baked_image_data[4*i + 2] = baked_color_data[4*i + 2]; - baked_image_data[4*i + 3] = baked_color_data[4*i + 3]; // Use alpha, not bump - i++; - } - } - } - else + S32 i = 0; + for (S32 u = 0; u < mWidth; u++) + { + for (S32 v = 0; v < mHeight; v++) { - S32 i = 0; - for( S32 u = 0; u < mWidth; u++ ) - { - for( S32 v = 0; v < mHeight; v++ ) - { - baked_image_data[4*i + 0] = baked_color_data[4*i + 0]; - baked_image_data[4*i + 1] = baked_color_data[4*i + 1]; - baked_image_data[4*i + 2] = baked_color_data[4*i + 2]; - baked_image_data[4*i + 3] = baked_mask_data[i]; - i++; - } - } + baked_image_data[5 * i + 0] = baked_color_data[4 * i + 0]; + baked_image_data[5 * i + 1] = baked_color_data[4 * i + 1]; + baked_image_data[5 * i + 2] = baked_color_data[4 * i + 2]; + baked_image_data[5 * i + 3] = baked_color_data[4 * i + 3]; // alpha should be correct for eyelashes. + baked_image_data[5 * i + 4] = baked_mask_data[i]; + i++; } } @@ -483,15 +374,15 @@ void LLTexLayerSetBuffer::readBackAndUpload(U8* baked_bump_data) if( valid ) { - LLBakedUploadData* baked_upload_data = new LLBakedUploadData( gAgent.getAvatarObject(), this ); - mUploadID = baked_upload_data->mID; + LLBakedUploadData* baked_upload_data = new LLBakedUploadData(gAgent.getAvatarObject(), this->mTexLayerSet, this, asset_id); + mUploadID = asset_id; gAssetStorage->storeAssetData(tid, LLAssetType::AT_TEXTURE, LLTexLayerSetBuffer::onTextureUploadComplete, baked_upload_data, TRUE, // temp_file - FALSE, // is_priority + TRUE, // is_priority TRUE); // store_local mNeedsUpload = FALSE; @@ -512,7 +403,6 @@ void LLTexLayerSetBuffer::readBackAndUpload(U8* baked_bump_data) } delete [] baked_color_data; - delete [] baked_bump_data; } @@ -523,83 +413,64 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid, void* user LLVOAvatar* avatar = gAgent.getAvatarObject(); - if (0 == result && avatar && !avatar->isDead()) + if (0 == result && + avatar && !avatar->isDead() && + baked_upload_data->mAvatar == avatar && // Sanity check: only the user's avatar should be uploading textures. + baked_upload_data->mLayerSet->hasComposite()) { - // Sanity check: only the user's avatar should be uploading textures. - if( baked_upload_data->mAvatar == avatar ) + LLTexLayerSetBuffer* layerset_buffer = baked_upload_data->mLayerSet->getComposite(); + + if (layerset_buffer->mUploadID.isNull()) + { + // The upload got canceled, we should be in the + // process of baking a new texture so request an + // upload with the new data + + // BAP: does this really belong in this callback, as + // opposed to where the cancellation takes place? + // suspect this does nothing. + layerset_buffer->requestUpload(); + } + else if (baked_upload_data->mID == layerset_buffer->mUploadID) { - // Because the avatar is still valid, it's layerset buffers should be valid also. - LLTexLayerSetBuffer* layerset_buffer = baked_upload_data->mLayerSetBuffer; + // This is the upload we're currently waiting for. + layerset_buffer->mUploadID.setNull(); layerset_buffer->mUploadPending = FALSE; - - if (layerset_buffer->mUploadID.isNull()) - { - // The upload got canceled, we should be in the process of baking a new texture - // so request an upload with the new data - layerset_buffer->requestUpload(); - } - else if( baked_upload_data->mID == layerset_buffer->mUploadID ) - { - // This is the upload we're currently waiting for. - layerset_buffer->mUploadID.setNull(); - if( result >= 0 ) - { - LLVOAvatar::ETextureIndex baked_te = avatar->getBakedTE( layerset_buffer->mTexLayerSet ); - if( !gAgent.cameraCustomizeAvatar() ) - { - avatar->setNewBakedTexture( baked_te, uuid ); - } - else - { - llinfos << "LLTexLayerSetBuffer::onTextureUploadComplete() when in Customize Avatar" << llendl; - } - } - else - { - llinfos << "Baked upload failed. Reason: " << result << llendl; - // *FIX: retry upload after n seconds, asset server could be busy - } + if (result >= 0) + { + LLVOAvatar::ETextureIndex baked_te = avatar->getBakedTE(layerset_buffer->mTexLayerSet); + U64 now = LLFrameTimer::getTotalTime(); // Record starting time + llinfos << "Baked texture upload took " << (S32)((now - baked_upload_data->mStartTime) / 1000) << " ms" << llendl; + avatar->setNewBakedTexture( baked_te, uuid ); } else { - llinfos << "Received baked texture out of date, ignored." << llendl; + // Avatar appearance is changing, ignore the upload results + llinfos << "Baked upload failed. Reason: " << result << llendl; + // *FIX: retry upload after n seconds, asset server could be busy } - - avatar->dirtyMesh(); } + else + { + llinfos << "Received baked texture out of date, ignored." << llendl; + } + + avatar->dirtyMesh(); } else { - // Baked texture failed to upload, but since we didn't set the new baked texture, it means that they'll - // try and rebake it at some point in the future (after login?) + // Baked texture failed to upload (in which case since we + // didn't set the new baked texture, it means that they'll try + // and rebake it at some point in the future (after login?)), + // or this response to upload is out of date, in which case a + // current response should be on the way or already processed. llwarns << "Baked upload failed" << llendl; } delete baked_upload_data; } -void LLTexLayerSetBuffer::bindBumpTexture( U32 stage ) -{ - if( mBumpTex.notNull() ) - { - gGL.getTexUnit(stage)->bindManual(LLTexUnit::TT_TEXTURE, mBumpTex->getTexName()); - gGL.getTexUnit(0)->activate(); - - if( mLastBindTime != LLImageGL::sLastFrameTime ) - { - mLastBindTime = LLImageGL::sLastFrameTime; - LLImageGL::updateBoundTexMem(mWidth * mHeight * 4); - } - } - else - { - gGL.getTexUnit(stage)->unbind(LLTexUnit::TT_TEXTURE); - gGL.getTexUnit(0)->activate(); - } -} - - //----------------------------------------------------------------------------- // LLTexLayerSet // An ordered set of texture layers that get composited into a single texture. @@ -683,15 +554,19 @@ LLTexLayerSet::LLTexLayerSet( LLVOAvatar* avatar ) mComposite( NULL ), mAvatar( avatar ), mUpdatesEnabled( FALSE ), - mHasBump( FALSE ), + mIsVisible(TRUE), + mBakedTexIndex(LLVOAvatar::TEX_HEAD_BAKED), mInfo( NULL ) { } LLTexLayerSet::~LLTexLayerSet() { + deleteCaches(); std::for_each(mLayerList.begin(), mLayerList.end(), DeletePointer()); + std::for_each(mMaskLayerList.begin(), mMaskLayerList.end(), DeletePointer()); delete mComposite; + mComposite = NULL; } //----------------------------------------------------------------------------- @@ -714,7 +589,14 @@ BOOL LLTexLayerSet::setInfo(LLTexLayerSetInfo *info) mInfo = NULL; return FALSE; } - mLayerList.push_back( layer ); + if (!layer->isVisibilityMask()) + { + mLayerList.push_back(layer); + } + else + { + mMaskLayerList.push_back(layer); + } } requestUpdate(); @@ -754,6 +636,11 @@ void LLTexLayerSet::deleteCaches() LLTexLayer* layer = *iter; layer->deleteCaches(); } + for (layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++) + { + LLTexLayer* layer = *iter; + layer->deleteCaches(); + } } // Returns TRUE if at least one packet of data has been received for each of the textures that this layerset depends on. @@ -770,101 +657,130 @@ BOOL LLTexLayerSet::isLocalTextureDataFinal() } -BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height ) +void LLTexLayerSet::renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height, bool forceClear) { - BOOL success = TRUE; + const LLTexLayerSetInfo *info = getInfo(); - LLGLSUIDefault gls_ui; - LLGLDepthTest gls_depth(GL_FALSE, GL_FALSE); - gGL.setColorMask(true, true); - - // composite color layers - for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) - { - LLTexLayer* layer = *iter; - if( layer->getRenderPass() == RP_COLOR ) - { - gGL.flush(); - success &= layer->render( x, y, width, height ); - gGL.flush(); - } - } + gGL.setColorMask(false, true); + gGL.setSceneBlendType(LLRender::BT_REPLACE); // (Optionally) replace alpha with a single component image from a tga file. - if( !getInfo()->mStaticAlphaFileName.empty() ) + if (!info->mStaticAlphaFileName.empty()) { LLGLSNoAlphaTest gls_no_alpha_test; gGL.flush(); - gGL.setColorMask(false, true); - gGL.setSceneBlendType(LLRender::BT_REPLACE); - { - LLImageGL* image_gl = gTexStaticImageList.getImageGL( getInfo()->mStaticAlphaFileName, TRUE ); - if( image_gl ) + LLImageGL* image_gl = gTexStaticImageList.getImageGL(info->mStaticAlphaFileName, TRUE); + if (image_gl) { LLGLSUIDefault gls_ui; gGL.getTexUnit(0)->bind(image_gl); - gl_rect_2d_simple_tex( width, height ); - } - else - { - success = FALSE; + gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_REPLACE); + gl_rect_2d_simple_tex(width, height); } } - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gGL.flush(); - gGL.setColorMask(true, true); - gGL.setSceneBlendType(LLRender::BT_ALPHA); } - else - if( getInfo()->mClearAlpha ) + else if (forceClear || info->mClearAlpha || (mMaskLayerList.size() > 0)) { // Set the alpha channel to one (clean up after previous blending) + gGL.flush(); LLGLDisable no_alpha(GL_ALPHA_TEST); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); gGL.color4f( 0.f, 0.f, 0.f, 1.f ); - gGL.flush(); - gGL.setColorMask(false, true); gl_rect_2d_simple( width, height ); - + gGL.flush(); - gGL.setColorMask(true, true); } - stop_glerror(); - return success; + // (Optional) Mask out part of the baked texture with alpha masks + // will still have an effect even if mClearAlpha is set or the alpha component was replaced + if (mMaskLayerList.size() > 0) + { + gGL.setSceneBlendType(LLRender::BT_MULT_ALPHA); + gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_REPLACE); + for (layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++) + { + LLTexLayer* layer = *iter; + gGL.flush(); + layer->blendAlphaTexture(x, y, width, height); + gGL.flush(); + } + } + + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + + gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); + gGL.setColorMask(true, true); + gGL.setSceneBlendType(LLRender::BT_ALPHA); } -BOOL LLTexLayerSet::renderBump( S32 x, S32 y, S32 width, S32 height ) +BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height ) { BOOL success = TRUE; + mIsVisible = TRUE; + + if (mMaskLayerList.size() > 0) + { + for (layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++) + { + LLTexLayer* layer = *iter; + if (layer->isInvisibleAlphaMask()) + { + mIsVisible = FALSE; + } + } + } LLGLSUIDefault gls_ui; LLGLDepthTest gls_depth(GL_FALSE, GL_FALSE); + gGL.setColorMask(true, true); - //static S32 bump_layer_count = 1; + // clear buffer area to ensure we don't pick up UI elements + { + gGL.flush(); + LLGLDisable no_alpha(GL_ALPHA_TEST); + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + gGL.color4f( 0.f, 0.f, 0.f, 1.f ); - for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) + gl_rect_2d_simple( width, height ); + + gGL.flush(); + } + + if (mIsVisible) { - LLTexLayer* layer = *iter; - if( layer->getRenderPass() == RP_BUMP ) + // composite color layers + for (layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++) { - success &= layer->render( x, y, width, height ); + LLTexLayer* layer = *iter; + if (layer->getRenderPass() == RP_COLOR || layer->getRenderPass() == RP_BUMP) + { + gGL.flush(); + success &= layer->render(x, y, width, height); + gGL.flush(); + } } + + renderAlphaMaskTextures(x, y, width, height, false); + + stop_glerror(); } + else + { + gGL.flush(); - // Set the alpha channel to one (clean up after previous blending) - LLGLDisable no_alpha(GL_ALPHA_TEST); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gGL.color4f( 0.f, 0.f, 0.f, 1.f ); - gGL.setColorMask(false, true); + gGL.setSceneBlendType(LLRender::BT_REPLACE); + LLGLDisable no_alpha(GL_ALPHA_TEST); + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + gGL.color4f( 0.f, 0.f, 0.f, 0.f ); - gl_rect_2d_simple( width, height ); - - gGL.setColorMask(true, true); - stop_glerror(); + gl_rect_2d_simple( width, height ); + gGL.setSceneBlendType(LLRender::BT_ALPHA); + + gGL.flush(); + } return success; } @@ -904,7 +820,7 @@ void LLTexLayerSet::createComposite() width /= 2; height /= 2; } - mComposite = new LLTexLayerSetBuffer( this, width, height, mHasBump ); + mComposite = new LLTexLayerSetBuffer(this, width, height); } } @@ -965,6 +881,9 @@ void LLTexLayerSet::gatherAlphaMasks(U8 *data, S32 width, S32 height) } } } + + // Set alpha back to that of our alpha masks. + renderAlphaMaskTextures(mComposite->getOriginX(), mComposite->getOriginY(), width, height, true); } void LLTexLayerSet::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components) @@ -986,7 +905,8 @@ LLTexLayerInfo::LLTexLayerInfo( ) mFixedColor( 0.f, 0.f, 0.f, 0.f ), mLocalTexture( -1 ), mStaticImageIsMask( FALSE ), - mUseLocalTextureAlphaOnly( FALSE ) + mUseLocalTextureAlphaOnly(FALSE), + mIsVisibilityMask(FALSE) { } @@ -1025,6 +945,14 @@ BOOL LLTexLayerInfo::parseXml(LLXmlTreeNode* node) static LLStdStringHandle global_color_string = LLXmlTree::addAttributeString("global_color"); node->getFastAttributeString( global_color_string, mGlobalColor ); + // Visibility mask (optional) + BOOL is_visibility; + static LLStdStringHandle visibility_mask_string = LLXmlTree::addAttributeString("visibility_mask"); + if (node->getFastAttributeBOOL(visibility_mask_string, is_visibility)) + { + mIsVisibilityMask = is_visibility; + } + // color attribute (optional) LLColor4U color4u; static LLStdStringHandle fixed_color_string = LLXmlTree::addAttributeString("fixed_color"); @@ -1107,9 +1035,45 @@ BOOL LLTexLayerInfo::parseXml(LLXmlTreeNode* node) { mLocalTexture = LLVOAvatar::LOCTEX_SKIRT; } + else if ("hair_grain" == local_texture) + { + mLocalTexture = LLVOAvatar::LOCTEX_HAIR; + } + else if ("hair_alpha" == local_texture) + { + mLocalTexture = LLVOAvatar::LOCTEX_HAIR_ALPHA; + } + else if ("head_alpha" == local_texture) + { + mLocalTexture = LLVOAvatar::LOCTEX_HEAD_ALPHA; + } + else if ("upper_alpha" == local_texture) + { + mLocalTexture = LLVOAvatar::LOCTEX_UPPER_ALPHA; + } + else if ("lower_alpha" == local_texture) + { + mLocalTexture = LLVOAvatar::LOCTEX_LOWER_ALPHA; + } + else if ("eyes_alpha" == local_texture) + { + mLocalTexture = LLVOAvatar::LOCTEX_EYES_ALPHA; + } + else if ("head_tattoo" == local_texture) + { + mLocalTexture = LLVOAvatar::LOCTEX_HEAD_TATTOO; + } + else if ("upper_tattoo" == local_texture) + { + mLocalTexture = LLVOAvatar::LOCTEX_UPPER_TATTOO; + } + else if ("lower_tattoo" == local_texture) + { + mLocalTexture = LLVOAvatar::LOCTEX_LOWER_TATTOO; + } else { - llwarns << " element has invalid local_texure attribute: " << mName << " " << local_texture << llendl; + llwarns << " element has invalid local_texture attribute: " << mName << " " << local_texture << llendl; return FALSE; } } @@ -1210,13 +1174,14 @@ LLTexLayer::~LLTexLayer() BOOL LLTexLayer::setInfo(LLTexLayerInfo* info) { - llassert(mInfo == NULL); + //llassert(mInfo == NULL); // nyx says this is probably bogus but needs investigating + if (mInfo != NULL) // above llassert(), but softened into a warning + { + llwarns << "BAD STUFF! mInfo != NULL" << llendl; + } mInfo = info; //mID = info->mID; // No ID - if (info->mRenderPass == RP_BUMP) - mTexLayerSet->setBump(TRUE); - { LLTexLayerInfo::morph_name_list_t::iterator iter; for (iter = mInfo->mMorphNameList.begin(); iter != mInfo->mMorphNameList.end(); iter++) @@ -1308,26 +1273,29 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height ) LLGLEnable color_mat(GL_COLOR_MATERIAL); gPipeline.disableLights(); - BOOL success = TRUE; - - BOOL color_specified = FALSE; - BOOL alpha_mask_specified = FALSE; - LLColor4 net_color; - color_specified = findNetColor( &net_color ); + BOOL color_specified = findNetColor(&net_color); + if (mTexLayerSet->getAvatar()->mIsDummy) + { + color_specified = true; + net_color = LLColor4(0.5, 0.5, 0.5, 1.0); + } + BOOL success = TRUE; + // If you can't see the layer, don't render it. if( is_approx_zero( net_color.mV[VW] ) ) { return success; } + BOOL alpha_mask_specified = FALSE; alpha_list_t::iterator iter = mParamAlphaList.begin(); if( iter != mParamAlphaList.end() ) { // If we have alpha masks, but we're skipping all of them, skip the whole layer. // However, we can't do this optimization if we have morph masks that need updating. - if( mMaskedMorphs.empty() ) +/* if( mMaskedMorphs.empty() ) { BOOL skip_layer = TRUE; @@ -1348,7 +1316,7 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height ) { return success; } - } + }*/ renderAlphaMasks( x, y, width, height, &net_color ); alpha_mask_specified = TRUE; @@ -1363,6 +1331,11 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height ) gGL.flush(); gGL.setSceneBlendType(LLRender::BT_REPLACE); } + else if (getInfo()->mUseLocalTextureAlphaOnly) + { + // Use the alpha channel only + gGL.setColorMask(false, true); + } if( (getInfo()->mLocalTexture != -1) && !getInfo()->mUseLocalTextureAlphaOnly ) { @@ -1370,6 +1343,10 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height ) LLImageGL* image_gl = NULL; if( mTexLayerSet->getAvatar()->getLocalTextureGL( getInfo()->mLocalTexture, &image_gl ) ) { + if (mTexLayerSet->getAvatar()->getLocalTextureID((LLVOAvatar::ETextureIndex)getInfo()->mLocalTexture) == IMG_DEFAULT_AVATAR) + { + image_gl = NULL; + } if( image_gl ) { LLGLDisable alpha_test(getInfo()->mWriteAllChannels ? GL_ALPHA_TEST : 0); @@ -1386,10 +1363,6 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height ) gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } } - else - { - success = FALSE; - } } } @@ -1429,6 +1402,12 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height ) stop_glerror(); } + if (getInfo()->mUseLocalTextureAlphaOnly) + { + // Restore color + alpha mode. + gGL.setColorMask(true, true); + } + if( !success ) { llinfos << "LLTexLayer::render() partial: " << getInfo()->mName << llendl; @@ -1436,6 +1415,49 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height ) return success; } +BOOL LLTexLayer::blendAlphaTexture(S32 x, S32 y, S32 width, S32 height) +{ + BOOL success = TRUE; + + gGL.flush(); + + if (!getInfo()->mStaticImageFileName.empty()) + { + LLImageGL* image_gl = gTexStaticImageList.getImageGL(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask); + if (image_gl) + { + LLGLSNoAlphaTest gls_no_alpha_test; + gGL.getTexUnit(0)->bind(image_gl, TRUE); + gl_rect_2d_simple_tex(width, height); + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + } + else + { + success = FALSE; + } + } + else + { + if (getInfo()->mLocalTexture >=0 && getInfo()->mLocalTexture < LLVOAvatar::TEX_NUM_ENTRIES) + { + LLImageGL* image_gl = NULL; + if (mTexLayerSet->getAvatar()->getLocalTextureGL((LLVOAvatar::ETextureIndex)getInfo()->mLocalTexture, &image_gl)) + { + if (image_gl) + { + LLGLSNoAlphaTest gls_no_alpha_test; + gGL.getTexUnit(0)->bind(image_gl); + gl_rect_2d_simple_tex(width, height); + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + success = TRUE; + } + } + } + } + + return success; +} + U8* LLTexLayer::getAlphaData() { LLCRC alpha_mask_crc; @@ -1561,7 +1583,7 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4 // Approximates a min() function gGL.flush(); - gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO); + gGL.setSceneBlendType(LLRender::BT_MULT_ALPHA); // Accumulate the alpha component of the texture if( getInfo()->mLocalTexture != -1 ) @@ -1585,10 +1607,6 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } } - else - { - success = FALSE; - } } } @@ -1607,10 +1625,6 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } } - else - { - success = FALSE; - } } } @@ -1629,7 +1643,7 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4 gGL.setColorMask(true, true); - if (!mMorphMasksValid && !mMaskedMorphs.empty()) + if (success && !mMorphMasksValid && !mMaskedMorphs.empty()) { LLCRC alpha_mask_crc; const LLUUID& uuid = mTexLayerSet->getAvatar()->getLocalTextureID(getInfo()->mLocalTexture); @@ -1778,6 +1792,26 @@ void LLTexLayer::invalidateMorphMasks() mMorphMasksValid = FALSE; } +BOOL LLTexLayer::isVisibilityMask() const +{ + return mInfo->mIsVisibilityMask; +} + +BOOL LLTexLayer::isInvisibleAlphaMask() +{ + const LLTexLayerInfo *info = getInfo(); + + if (info && info->mLocalTexture >= 0 && info->mLocalTexture < LLVOAvatar::TEX_NUM_ENTRIES) + { + if (mTexLayerSet->getAvatar()->getLocalTextureID((LLVOAvatar::ETextureIndex)info->mLocalTexture) == IMG_INVISIBLE) + { + return TRUE; + } + } + + return FALSE; +} + //----------------------------------------------------------------------------- // LLTexLayerParamAlphaInfo //----------------------------------------------------------------------------- @@ -1924,8 +1958,13 @@ void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL set_by_user) LLVOAvatar* avatar = mTexLayer->getTexLayerSet()->getAvatar(); if( avatar->getSex() & getSex() ) { + if ( gAgent.cameraCustomizeAvatar() ) + { + set_by_user = FALSE; + } avatar->invalidateComposite( mTexLayer->getTexLayerSet(), set_by_user ); mTexLayer->invalidateMorphMasks(); + avatar->updateMeshTextures(); } } } diff --git a/linden/indra/newview/lltexlayer.h b/linden/indra/newview/lltexlayer.h index 69132fe..cef4c84 100644 --- a/linden/indra/newview/lltexlayer.h +++ b/linden/indra/newview/lltexlayer.h @@ -40,6 +40,7 @@ #include "lluuid.h" #include "llviewerimage.h" #include "llviewervisualparam.h" +#include "llvoavatar.h" #include "llwearable.h" #include "v4color.h" #include "llfloater.h" @@ -185,6 +186,7 @@ class LLTexLayerInfo std::string mStaticImageFileName; BOOL mStaticImageIsMask; BOOL mUseLocalTextureAlphaOnly; // Ignore RGB channels from the input texture. Use alpha as a mask + BOOL mIsVisibilityMask; typedef std::vector > morph_name_list_t; morph_name_list_t mMorphNameList; @@ -204,14 +206,13 @@ class LLTexLayerInfo class LLTexLayerSetBuffer : public LLDynamicTexture { public: - LLTexLayerSetBuffer( LLTexLayerSet* owner, S32 width, S32 height, BOOL has_bump ); + LLTexLayerSetBuffer(LLTexLayerSet* owner, S32 width, S32 height); virtual ~LLTexLayerSetBuffer(); virtual void preRender(BOOL clear_depth); virtual void postRender(BOOL success); virtual BOOL render(); BOOL updateImmediate(); - void bindBumpTexture( U32 stage ); bool isInitialized(void) const; BOOL needsRender(); void requestUpdate(); @@ -219,8 +220,7 @@ class LLTexLayerSetBuffer : public LLDynamicTexture void cancelUpload(); BOOL uploadPending() { return mUploadPending; } BOOL render( S32 x, S32 y, S32 width, S32 height ); - void readBackAndUpload(U8* baked_bump_data); - void createBumpTexture() ; + void readBackAndUpload(); static void onTextureUploadComplete( const LLUUID& uuid, void* userdata, @@ -235,16 +235,13 @@ class LLTexLayerSetBuffer : public LLDynamicTexture void popProjection(); private: - BOOL mHasBump ; BOOL mNeedsUpdate; BOOL mNeedsUpload; BOOL mUploadPending; LLUUID mUploadID; // Identifys the current upload process (null if none). Used to avoid overlaps (eg, when the user rapidly makes two changes outside of Face Edit) LLTexLayerSet* mTexLayerSet; - LLPointer mBumpTex; // zero if none static S32 sGLByteCount; - static S32 sGLBumpByteCount; }; //----------------------------------------------------------------------------- @@ -253,6 +250,7 @@ class LLTexLayerSetBuffer : public LLDynamicTexture //----------------------------------------------------------------------------- class LLTexLayerSet { + friend class LLTexLayerSetBuffer; public: LLTexLayerSet( LLVOAvatar* avatar ); ~LLTexLayerSet(); @@ -263,7 +261,7 @@ class LLTexLayerSet BOOL setInfo(LLTexLayerSetInfo *info); BOOL render( S32 x, S32 y, S32 width, S32 height ); - BOOL renderBump( S32 x, S32 y, S32 width,S32 height ); + void renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height, bool forceClear = false); BOOL isBodyRegion( const std::string& region ) { return mInfo->mBodyRegion == region; } LLTexLayerSetBuffer* getComposite(); void requestUpdate(); @@ -282,8 +280,9 @@ class LLTexLayerSet void applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components); const std::string getBodyRegion() { return mInfo->mBodyRegion; } BOOL hasComposite() { return (mComposite != NULL); } - void setBump( BOOL b ) { mHasBump = b; } - BOOL hasBump() { return mHasBump; } + LLVOAvatar::ETextureIndex getBakedTE() { return mBakedTexIndex; } + void setBakedTE(LLVOAvatar::ETextureIndex index) { mBakedTexIndex = index; } + BOOL isVisible() const { return mIsVisible; } public: static BOOL sHasCaches; @@ -291,11 +290,14 @@ class LLTexLayerSet protected: typedef std::vector layer_list_t; layer_list_t mLayerList; + layer_list_t mMaskLayerList; LLTexLayerSetBuffer* mComposite; // Backlink only; don't make this an LLPointer. LLVOAvatar* mAvatar; BOOL mUpdatesEnabled; - BOOL mHasBump; + BOOL mIsVisible; + + LLVOAvatar::ETextureIndex mBakedTexIndex; LLTexLayerSetInfo *mInfo; }; @@ -347,6 +349,9 @@ class LLTexLayer BOOL renderImageRaw( U8* in_data, S32 in_width, S32 in_height, S32 in_components, S32 width, S32 height, BOOL is_mask ); BOOL renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4* colorp ); BOOL hasAlphaParams() { return (!mParamAlphaList.empty());} + BOOL blendAlphaTexture(S32 x, S32 y, S32 width, S32 height); + BOOL isVisibilityMask() const; + BOOL isInvisibleAlphaMask(); protected: LLTexLayerSet* mTexLayerSet; @@ -537,13 +542,15 @@ class LLTexStaticImageList class LLBakedUploadData { public: - LLBakedUploadData( LLVOAvatar* avatar, LLTexLayerSetBuffer* layerset_buffer ); + LLBakedUploadData( LLVOAvatar* avatar, LLTexLayerSet* layerset, LLTexLayerSetBuffer* layerset_buffer, const LLUUID & id); ~LLBakedUploadData() {} LLUUID mID; LLVOAvatar* mAvatar; // just backlink, don't LLPointer + LLTexLayerSet* mLayerSet; LLTexLayerSetBuffer* mLayerSetBuffer; LLUUID mWearableAssets[WT_COUNT]; + U64 mStartTime; // Used to measure time baked texture upload requires }; extern LLTexStaticImageList gTexStaticImageList; diff --git a/linden/indra/newview/lltexturectrl.cpp b/linden/indra/newview/lltexturectrl.cpp index 4564b53..2e1b347 100644 --- a/linden/indra/newview/lltexturectrl.cpp +++ b/linden/indra/newview/lltexturectrl.cpp @@ -99,6 +99,10 @@ static const F32 CONTEXT_FADE_TIME = 0.08f; //static const char WHITE_IMAGE_NAME[] = "Blank Texture"; //static const char NO_IMAGE_NAME[] = "None"; +//MK +extern BOOL RRenabled; +//mk + ////////////////////////////////////////////////////////////////////////////////////////// // LLFloaterTexturePicker @@ -111,7 +115,9 @@ class LLFloaterTexturePicker : public LLFloater const std::string& label, PermissionMask immediate_filter_perm_mask, PermissionMask non_immediate_filter_perm_mask, - BOOL can_apply_immediately); + BOOL can_apply_immediately, + const std::string& fallback_image_name); + virtual ~LLFloaterTexturePicker(); // LLView overrides @@ -164,6 +170,7 @@ class LLFloaterTexturePicker : public LLFloater LLTextureCtrl* mOwner; LLUUID mImageAssetID; // Currently selected texture + std::string mFallbackImageName; // What to show if currently selected texture is null. LLUUID mWhiteImageAssetID; LLUUID mSpecialCurrentImageAssetID; // Used when the asset id has no corresponding texture in the user's inventory. @@ -194,7 +201,8 @@ LLFloaterTexturePicker::LLFloaterTexturePicker( const std::string& label, PermissionMask immediate_filter_perm_mask, PermissionMask non_immediate_filter_perm_mask, - BOOL can_apply_immediately) + BOOL can_apply_immediately, + const std::string& fallback_image_name) : LLFloater( std::string("texture picker"), rect, @@ -203,6 +211,7 @@ LLFloaterTexturePicker::LLFloaterTexturePicker( TEX_PICKER_MIN_WIDTH, TEX_PICKER_MIN_HEIGHT ), mOwner( owner ), mImageAssetID( owner->getImageAssetID() ), + mFallbackImageName( fallback_image_name ), mWhiteImageAssetID( gSavedSettings.getString( "UIImgWhiteUUID" ) ), mOriginalImageAssetID(owner->getImageAssetID()), mLabel(label), @@ -370,6 +379,13 @@ BOOL LLFloaterTexturePicker::handleDragAndDrop( EAcceptance *accept, std::string& tooltip_msg) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowinv) + { + *accept = ACCEPT_NO; + return TRUE; + } +//mk BOOL handled = FALSE; if (cargo_type == DAD_TEXTURE) @@ -555,6 +571,11 @@ void LLFloaterTexturePicker::draw() mTexturep = gImageList.getImage(mImageAssetID, MIPMAP_YES, IMMEDIATE_NO); mTexturep->setBoostLevel(LLViewerImage::BOOST_PREVIEW); } + else if (!mFallbackImageName.empty()) + { + mTexturep = gImageList.getImageFromFile(mFallbackImageName); + mTexturep->setBoostLevel(LLViewerImage::BOOST_PREVIEW); + } if (mTentativeLabel) { @@ -1136,7 +1157,9 @@ void LLTextureCtrl::showPicker(BOOL take_focus) mLabel, mImmediateFilterPermMask, mNonImmediateFilterPermMask, - mCanApplyImmediately); + mCanApplyImmediately, + mFallbackImageName); + mFloaterHandle = floaterp->getHandle(); gFloaterView->getParentFloater(this)->addDependentFloater(floaterp); @@ -1295,15 +1318,25 @@ void LLTextureCtrl::draw() { mBorder->setKeyboardFocusHighlight(hasFocus()); - if (mImageAssetID.isNull() || !mValid) + if (!mValid) { mTexturep = NULL; } - else + else if (!mImageAssetID.isNull()) { mTexturep = gImageList.getImage(mImageAssetID, MIPMAP_YES, IMMEDIATE_NO); mTexturep->setBoostLevel(LLViewerImage::BOOST_PREVIEW); } + else if (!mFallbackImageName.empty()) + { + // Show fallback image. + mTexturep = gImageList.getImageFromFile(mFallbackImageName); + mTexturep->setBoostLevel(LLViewerImage::BOOST_PREVIEW); + } + else // mImageAssetID == LLUUID::null + { + mTexturep = NULL; + } // Border LLRect border( 0, getRect().getHeight(), getRect().getWidth(), BTN_HEIGHT_SMALL ); diff --git a/linden/indra/newview/lltexturectrl.h b/linden/indra/newview/lltexturectrl.h index 34623d4..8c72b01 100644 --- a/linden/indra/newview/lltexturectrl.h +++ b/linden/indra/newview/lltexturectrl.h @@ -115,9 +115,12 @@ class LLTextureCtrl const LLUUID& getImageAssetID() const { return mImageAssetID; } void setDefaultImageAssetID( const LLUUID& id ) { mDefaultImageAssetID = id; } + const LLUUID& getDefaultImageAssetID() const { return mDefaultImageAssetID; } const std::string& getDefaultImageName() const { return mDefaultImageName; } - const LLUUID& getDefaultImageAssetID() const { return mDefaultImageAssetID; } + + void setFallbackImageName( const std::string& name ) { mFallbackImageName = name; } + const std::string& getFallbackImageName() const { return mFallbackImageName; } void setCaption(const std::string& caption); void setCanApplyImmediately(BOOL b); @@ -163,6 +166,7 @@ class LLTextureCtrl LLUUID mImageItemID; LLUUID mImageAssetID; LLUUID mDefaultImageAssetID; + std::string mFallbackImageName; std::string mDefaultImageName; LLHandle mFloaterHandle; LLTextBox* mTentativeLabel; diff --git a/linden/indra/newview/lltoolbar.cpp b/linden/indra/newview/lltoolbar.cpp index 8202191..7c96dc4 100644 --- a/linden/indra/newview/lltoolbar.cpp +++ b/linden/indra/newview/lltoolbar.cpp @@ -51,6 +51,7 @@ #include "llinventoryview.h" #include "llfloaterchatterbox.h" #include "llfloaterfriends.h" +#include "llfloatergroups.h" #include "llfloatersnapshot.h" #include "lltoolmgr.h" #include "llui.h" @@ -60,11 +61,11 @@ #include "lluictrlfactory.h" #include "llviewerwindow.h" #include "lltoolgrab.h" -#include "llcombobox.h" -#include "llfloaterchat.h" -#include "llfloatermute.h" -#include "llimpanel.h" -#include "llscrolllistctrl.h" +#include "llfloateravatarlist.h" + +//MK +extern BOOL RRenabled; +//mk #if LL_DARWIN @@ -105,25 +106,44 @@ F32 LLToolBar::sInventoryAutoOpenTime = 1.f; // Functions // -LLToolBar::LLToolBar() -: LLPanel() +LLToolBar::LLToolBar(const std::string& name, const LLRect& r) +: LLPanel(name, r, BORDER_NO) #if LL_DARWIN , mResizeHandle(NULL) #endif // LL_DARWIN { setIsChrome(TRUE); + setFollows( FOLLOWS_LEFT | FOLLOWS_RIGHT | FOLLOWS_BOTTOM ); + + if (gSavedSettings.getBOOL("ShowGroupsButton")) + { + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_toolbar2.xml"); + } + else + { + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_toolbar1.xml"); + } setFocusRoot(TRUE); } BOOL LLToolBar::postBuild() { - childSetCommitCallback("communicate_btn", onClickCommunicate, this); + childSetAction("communicate_btn", onClickCommunicate, this); childSetControlName("communicate_btn", "ShowCommunicate"); childSetAction("chat_btn", onClickChat, this); childSetControlName("chat_btn", "ChatVisible"); + childSetAction("friends_btn", onClickFriends, this); + childSetControlName("friends_btn", "ShowFriends"); + + if (gSavedSettings.getBOOL("ShowGroupsButton")) + { + childSetAction("groups_btn", onClickGroups, this); + childSetControlName("groups_btn", "ShowGroups"); + } + childSetAction("appearance_btn", onClickAppearance, this); childSetControlName("appearance_btn", ""); @@ -154,6 +174,9 @@ BOOL LLToolBar::postBuild() childSetAction("inventory_btn", onClickInventory, this); childSetControlName("inventory_btn", "ShowInventory"); + childSetAction("avatar_list_btn", onClickAvatarList, this); + childSetControlName("avatar_list_btn", "ShowAvatarList"); + for (child_list_const_iter_t child_iter = getChildList()->begin(); child_iter != getChildList()->end(); ++child_iter) { @@ -171,8 +194,6 @@ BOOL LLToolBar::postBuild() LLRect rect(0, 0, RESIZE_HANDLE_WIDTH, RESIZE_HANDLE_HEIGHT); mResizeHandle = new LLFakeResizeHandle(std::string(""), rect, RESIZE_HANDLE_WIDTH, RESIZE_HANDLE_HEIGHT); this->addChildAtEnd(mResizeHandle); - LLLayoutStack* toolbar_stack = getChild("toolbar_stack"); - toolbar_stack->reshape(toolbar_stack->getRect().getWidth() - RESIZE_HANDLE_WIDTH, toolbar_stack->getRect().getHeight()); } #endif // LL_DARWIN @@ -240,14 +261,19 @@ BOOL LLToolBar::visible(void*) void LLToolBar::layoutButtons() { -#if LL_DARWIN + // Always spans whole window. JC const S32 FUDGE_WIDTH_OF_SCREEN = 4; - S32 width = gViewerWindow->getWindowWidth() + FUDGE_WIDTH_OF_SCREEN; + S32 width = gViewerWindow->getWindowWidth() + FUDGE_WIDTH_OF_SCREEN; + S32 count = getChildCount(); S32 pad = 2; +#if LL_DARWIN // this function may be called before postBuild(), in which case mResizeHandle won't have been set up yet. if(mResizeHandle != NULL) { + // a resize handle has been added as a child, increasing the count by one. + count--; + if(!gViewerWindow->getWindow()->getFullscreen()) { // Only when running in windowed mode on the Mac, leave room for a resize widget on the right edge of the bar. @@ -267,6 +293,34 @@ void LLToolBar::layoutButtons() } } #endif // LL_DARWIN + + // We actually want to extend "pad" pixels off the right edge of the + // screen, such that the rightmost button is aligned. + F32 segment_width = (F32)(width + pad) / (F32)count; + S32 btn_width = lltrunc(segment_width - pad); + + // Evenly space all views + S32 height = -1; + S32 i = count - 1; + for (child_list_const_iter_t child_iter = getChildList()->begin(); + child_iter != getChildList()->end(); ++child_iter) + { + LLView *btn_view = *child_iter; + LLButton* buttonp = dynamic_cast(btn_view); + if(buttonp) + { + if (height < 0) + { + height = btn_view->getRect().getHeight(); + } + S32 x = llround(i*segment_width); + S32 y = 0; + LLRect r; + r.setOriginAndSize(x, y, btn_width, height); + btn_view->setRect(r); + i--; + } + } } @@ -293,10 +347,20 @@ void LLToolBar::refresh() { sitting = gAgent.getAvatarObject()->mIsSitting; } - childSetEnabled("fly_btn", (gAgent.canFly() || gAgent.getFlying()) && !sitting ); - - childSetEnabled("build_btn", LLViewerParcelMgr::getInstance()->agentCanBuild() ); + +//MK + if (RRenabled) + { + childSetEnabled("build_btn", LLViewerParcelMgr::getInstance()->agentCanBuild() && !gAgent.mRRInterface.mContainsRez && !gAgent.mRRInterface.mContainsEdit); + childSetEnabled("avatar_list_btn", !gAgent.mRRInterface.mContainsShownames); + childSetEnabled("radar_btn", !gAgent.mRRInterface.mContainsShowminimap); + childSetEnabled("map_btn", !gAgent.mRRInterface.mContainsShowworldmap && !gAgent.mRRInterface.mContainsShowloc); + childSetEnabled("inventory_btn", !gAgent.mRRInterface.mContainsShowinv); + } + else +//mk + childSetEnabled("build_btn", LLViewerParcelMgr::getInstance()->agentCanBuild() ); // Check to see if we're in build mode BOOL build_mode = LLToolMgr::getInstance()->inEdit(); @@ -306,132 +370,13 @@ void LLToolBar::refresh() build_mode = FALSE; } gSavedSettings.setBOOL("BuildBtnState", build_mode); - - updateCommunicateList(); -} - -void LLToolBar::updateCommunicateList() -{ - LLFlyoutButton* communicate_button = getChild("communicate_btn"); - LLSD selected = communicate_button->getValue(); - - communicate_button->removeall(); - - LLFloater* frontmost_floater = LLFloaterChatterBox::getInstance()->getActiveFloater(); - LLScrollListItem* itemp = NULL; - - itemp = communicate_button->add(LLFloaterMyFriends::getInstance()->getShortTitle(), LLSD("contacts"), ADD_TOP); - if (LLFloaterMyFriends::getInstance() == frontmost_floater) - { - ((LLScrollListText*)itemp->getColumn(0))->setFontStyle(LLFontGL::BOLD); - // make sure current tab is selected in list - if (selected.isUndefined()) - { - selected = itemp->getValue(); - } - } - itemp = communicate_button->add(LLFloaterChat::getInstance()->getShortTitle(), LLSD("local chat"), ADD_TOP); - if (LLFloaterChat::getInstance() == frontmost_floater) - { - ((LLScrollListText*)itemp->getColumn(0))->setFontStyle(LLFontGL::BOLD); - if (selected.isUndefined()) - { - selected = itemp->getValue(); - } - } - communicate_button->addSeparator(ADD_TOP); - communicate_button->add(getString("Redock Windows"), LLSD("redock"), ADD_TOP); - communicate_button->addSeparator(ADD_TOP); - communicate_button->add(LLFloaterMute::getInstance()->getShortTitle(), LLSD("mute list"), ADD_TOP); - - std::set >::const_iterator floater_handle_it; - - if (gIMMgr->getIMFloaterHandles().size() > 0) - { - communicate_button->addSeparator(ADD_TOP); - } - - for(floater_handle_it = gIMMgr->getIMFloaterHandles().begin(); floater_handle_it != gIMMgr->getIMFloaterHandles().end(); ++floater_handle_it) - { - LLFloaterIMPanel* im_floaterp = (LLFloaterIMPanel*)floater_handle_it->get(); - if (im_floaterp) - { - std::string floater_title = im_floaterp->getNumUnreadMessages() > 0 ? "*" : ""; - floater_title.append(im_floaterp->getShortTitle()); - itemp = communicate_button->add(floater_title, im_floaterp->getSessionID(), ADD_TOP); - if (im_floaterp == frontmost_floater) - { - ((LLScrollListText*)itemp->getColumn(0))->setFontStyle(LLFontGL::BOLD); - if (selected.isUndefined()) - { - selected = itemp->getValue(); - } - } - } - } - - communicate_button->setToggleState(gSavedSettings.getBOOL("ShowCommunicate")); - communicate_button->setValue(selected); } // static -void LLToolBar::onClickCommunicate(LLUICtrl* ctrl, void* user_data) +void LLToolBar::onClickCommunicate(void* user_data) { - LLToolBar* toolbar = (LLToolBar*)user_data; - LLFlyoutButton* communicate_button = toolbar->getChild("communicate_btn"); - - LLSD selected_option = communicate_button->getValue(); - - if (selected_option.asString() == "contacts") - { - LLFloaterMyFriends::showInstance(); - } - else if (selected_option.asString() == "local chat") - { - LLFloaterChat::showInstance(); - } - else if (selected_option.asString() == "redock") - { - LLFloaterChatterBox::getInstance()->addFloater(LLFloaterMyFriends::getInstance(), FALSE); - LLFloaterChatterBox::getInstance()->addFloater(LLFloaterChat::getInstance(), FALSE); - LLUUID session_to_show; - - std::set >::const_iterator floater_handle_it; - for(floater_handle_it = gIMMgr->getIMFloaterHandles().begin(); floater_handle_it != gIMMgr->getIMFloaterHandles().end(); ++floater_handle_it) - { - LLFloater* im_floaterp = floater_handle_it->get(); - if (im_floaterp) - { - if (im_floaterp->isFrontmost()) - { - session_to_show = ((LLFloaterIMPanel*)im_floaterp)->getSessionID(); - } - LLFloaterChatterBox::getInstance()->addFloater(im_floaterp, FALSE); - } - } - - LLFloaterChatterBox::showInstance(session_to_show); - } - else if (selected_option.asString() == "mute list") - { - LLFloaterMute::showInstance(); - } - else if (selected_option.isUndefined()) // user just clicked the communicate button, treat as toggle - { - if (LLFloaterChatterBox::getInstance()->getFloaterCount() == 0) - { - LLFloaterMyFriends::toggleInstance(); - } - else - { - LLFloaterChatterBox::toggleInstance(); - } - } - else // otherwise selection_option is a specific IM session id - { - LLFloaterChatterBox::showInstance(selected_option); - } + LLFloaterChatterBox::toggleInstance(LLSD()); } @@ -441,6 +386,7 @@ void LLToolBar::onClickChat(void* user_data) handle_chat(NULL); } + // static void LLToolBar::onClickAppearance(void*) { @@ -481,6 +427,11 @@ void LLToolBar::onClickSit(void*) { // stand up gAgent.setFlying(FALSE); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsUnsit) { + return; + } +//mk gAgent.setControlFlags(AGENT_CONTROL_STAND_UP); } } @@ -521,6 +472,25 @@ void LLToolBar::onClickMap(void*) } +// static +void LLToolBar::onClickFriends(void*) +{ + LLFloaterFriends::toggle(); +} + + +// static +void LLToolBar::onClickGroups(void*) +{ + LLFloaterGroups::toggle(); +} + +//static +void LLToolBar::onClickAvatarList(void*) +{ + LLFloaterAvatarList::toggle(NULL); +} + // static void LLToolBar::onClickInventory(void*) { diff --git a/linden/indra/newview/lltoolbar.h b/linden/indra/newview/lltoolbar.h index 720b9c0..68010da 100644 --- a/linden/indra/newview/lltoolbar.h +++ b/linden/indra/newview/lltoolbar.h @@ -47,7 +47,7 @@ class LLToolBar : public LLPanel { public: - LLToolBar(); + LLToolBar(const std::string& name, const LLRect& rect ); ~LLToolBar(); /*virtual*/ BOOL postBuild(); @@ -70,8 +70,10 @@ class LLToolBar void refresh(); // callbacks - static void onClickCommunicate(LLUICtrl*, void*); + static void onClickCommunicate(void*); static void onClickChat(void* data); + static void onClickFriends(void* data); + static void onClickGroups(void* data); static void onClickAppearance(void* data); static void onClickClothing(void* data); static void onClickFly(void*); @@ -82,13 +84,10 @@ class LLToolBar static void onClickRadar(void* data); static void onClickMap(void* data); static void onClickInventory(void* data); + static void onClickAvatarList(void* data); static F32 sInventoryAutoOpenTime; -private: - void updateCommunicateList(); - - private: BOOL mInventoryAutoOpen; LLFrameTimer mInventoryAutoOpenTimer; diff --git a/linden/indra/newview/lltooldraganddrop.cpp b/linden/indra/newview/lltooldraganddrop.cpp index 7628f08..dbef651 100644 --- a/linden/indra/newview/lltooldraganddrop.cpp +++ b/linden/indra/newview/lltooldraganddrop.cpp @@ -60,6 +60,8 @@ #include "llviewerobject.h" #include "llviewerobjectlist.h" #include "llviewerregion.h" +#include "llparcel.h" +#include "llviewerparcelmgr.h" #include "llviewerstats.h" #include "llviewerwindow.h" #include "llvoavatar.h" @@ -67,6 +69,9 @@ #include "llworld.h" #include "object_flags.h" +//MK +extern BOOL RRenabled; +//mk // MAX ITEMS is based on (sizeof(uuid)+2) * count must be < MTUBYTES // or 18 * count < 1200 => count < 1200/18 => 66. I've cut it down a @@ -1216,6 +1221,25 @@ void LLToolDragAndDrop::dropScript(LLViewerObject* hit_obj, } if(hit_obj && item) { +//MK + if (RRenabled) + { + // can't edit objects that someone is sitting on, + // when prevented from sit-tping + if (gAgent.mRRInterface.contains ("sittp") || gAgent.mRRInterface.mContainsUnsit) + { + if (hit_obj->isSeat()) + { + return; + } + } + + if (!gAgent.mRRInterface.canDetach(hit_obj)) + { + return; + } + } +//mk LLPointer new_script = new LLViewerInventoryItem(item); if(!item->getPermissions().allowCopyBy(gAgent.getID())) { @@ -1267,6 +1291,13 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target, return; } +//MK + if (RRenabled && gAgent.mRRInterface.mContainsRez) + { + return; + } +//mk + //llinfos << "Rezzing object" << llendl; make_ui_sound("UISndObjectRezIn"); LLViewerInventoryItem* item; @@ -1344,8 +1375,30 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target, msg->nextBlockFast(_PREHASH_AgentData); msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID()); +// RezWithLandGroup 2009-05, If avatar is in land group/land owner group, + //it rezzes it with it to prevent autoreturn/whatever... + if ( gSavedSettings.getBOOL("RezWithLandGroup") ) + { + LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); + if ( gAgent.isInGroup(parcel->getGroupID()) ) + { + msg->addUUIDFast(_PREHASH_GroupID, parcel->getGroupID()); + } + else if ( gAgent.isInGroup(parcel->getOwnerID()) ) + { + msg->addUUIDFast(_PREHASH_GroupID, parcel->getOwnerID()); + } + else + { + msg->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID()); + } + } + else + { + msg->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID()); + } + msg->nextBlock("RezData"); // if it's being rezzed from task inventory, we need to enable // saving it back into the task inventory. @@ -1933,6 +1986,25 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL BOOL volume = (LL_PCODE_VOLUME == obj->getPCode()); BOOL attached = obj->isAttachment(); BOOL unrestricted = ((perm.getMaskBase() & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) ? TRUE : FALSE; +//MK + if (RRenabled) + { + // can't edit objects that someone is sitting on, + // when prevented from sit-tping + if (gAgent.mRRInterface.contains ("sittp") || gAgent.mRRInterface.mContainsUnsit) + { + if (obj->isSeat()) + { + return ACCEPT_NO_LOCKED; + } + } + + if (!gAgent.mRRInterface.canDetach(obj)) + { + return ACCEPT_NO_LOCKED; + } + } +//mk if(attached && !unrestricted) { return ACCEPT_NO_LOCKED; @@ -1963,6 +2035,12 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv( LLViewerObject* obj, S32 face, MASK mask, BOOL drop) { lldebugs << "LLToolDragAndDrop::dad3dRezAttachmentFromInv()" << llendl; +//MK + if (RRenabled && gAgent.mRRInterface.mContainsDetach) + { + return ACCEPT_NO; + } +//mk // must be in the user's inventory if(mSource != SOURCE_AGENT && mSource != SOURCE_LIBRARY) { @@ -2376,6 +2454,14 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory( locateInventory(item, category); if(!category) return ACCEPT_NO; +//MK + if (RRenabled && (gAgent.mRRInterface.mContainsDetach + || gAgent.mRRInterface.contains ("addoutfit") + || gAgent.mRRInterface.contains ("remoutfit"))) + { + return ACCEPT_NO; + } +//mk if (drop) { // Don't wear anything until initial wearables are loaded, can @@ -2570,7 +2656,13 @@ EAcceptance LLToolDragAndDrop::dad3dGiveInventoryObject( // item has to be in agent inventory. if(mSource != SOURCE_AGENT) return ACCEPT_NO; - +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + // to avoid having "so-and-so accepted/declined your inventory offer." messages + return ACCEPT_NO; + } +//mk // find the item now. LLViewerInventoryItem* item; LLViewerInventoryCategory* cat; @@ -2607,6 +2699,13 @@ EAcceptance LLToolDragAndDrop::dad3dGiveInventory( lldebugs << "LLToolDragAndDrop::dad3dGiveInventory()" << llendl; // item has to be in agent inventory. if(mSource != SOURCE_AGENT) return ACCEPT_NO; +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + // to avoid having "so-and-so accepted/declined your inventory offer." messages + return ACCEPT_NO; + } +//mk LLViewerInventoryItem* item; LLViewerInventoryCategory* cat; locateInventory(item, cat); @@ -2628,6 +2727,13 @@ EAcceptance LLToolDragAndDrop::dad3dGiveInventoryCategory( LLViewerObject* obj, S32 face, MASK mask, BOOL drop) { lldebugs << "LLToolDragAndDrop::dad3dGiveInventoryCategory()" << llendl; +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + // to avoid having "so-and-so accepted/declined your inventory offer." messages + return ACCEPT_NO; + } +//mk if(drop && obj) { LLViewerInventoryItem* item; diff --git a/linden/indra/newview/lltoolface.cpp b/linden/indra/newview/lltoolface.cpp index d5e4f81..1660306 100644 --- a/linden/indra/newview/lltoolface.cpp +++ b/linden/indra/newview/lltoolface.cpp @@ -47,6 +47,10 @@ #include "llviewerwindow.h" #include "llfloatertools.h" +//MK +extern BOOL RRenabled; +//mk + // // Member functions // @@ -91,6 +95,19 @@ void LLToolFace::pickCallback(const LLPickInfo& pick_info) LLViewerObject* hit_obj = pick_info.getObject(); if (hit_obj) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsFartouch + && !hit_obj->isHUDAttachment()) + { + LLVector3 pos = hit_obj->getPositionRegion (); +// LLVector3 pos = pick_info.mIntersection; // for some reason using mIntersection doesn't work in this case... + pos -= gAgent.getPositionAgent (); + if (pos.magVec () >= 1.5) + { + return; + } + } +//mk S32 hit_face = pick_info.mObjectFace; if (hit_obj->isAvatar()) diff --git a/linden/indra/newview/lltoolgrab.cpp b/linden/indra/newview/lltoolgrab.cpp index a6695f9..3c947eb 100644 --- a/linden/indra/newview/lltoolgrab.cpp +++ b/linden/indra/newview/lltoolgrab.cpp @@ -71,6 +71,10 @@ BOOL gGrabBtnSpin = FALSE; LLTool* gGrabTransientTool = NULL; extern BOOL gDebugClicks; +//MK +extern BOOL RRenabled; +//mk + // // Methods // @@ -173,6 +177,25 @@ BOOL LLToolGrab::handleObjectHit(const LLPickInfo& info) { mGrabPick = info; LLViewerObject* objectp = mGrabPick.getObject(); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsFartouch + && !objectp->isHUDAttachment()) + { +// LLVector3 pos = objectp->getPositionRegion (); + LLVector3 pos = mGrabPick.mIntersection; + pos -= gAgent.getPositionAgent (); + if (pos.magVec () >= 1.5) + { + // hide grab tool immediately + if (gGrabTransientTool) + { + gBasicToolset->selectTool( gGrabTransientTool ); + gGrabTransientTool = NULL; + } + return TRUE; + } + } +//mk if (gDebugClicks) { @@ -301,6 +324,19 @@ void LLToolGrab::startSpin() // Was saveSelectedObjectTransform() LLViewerObject *root = (LLViewerObject *)objectp->getRoot(); mSpinRotation = root->getRotation(); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsFartouch + && !objectp->isHUDAttachment()) + { +// LLVector3 pos = objectp->getPositionRegion (); + LLVector3 pos = mGrabPick.mIntersection; + pos -= gAgent.getPositionAgent (); + if (pos.magVec () >= 1.5) + { + return; + } + } +//mk LLMessageSystem *msg = gMessageSystem; msg->newMessageFast(_PREHASH_ObjectSpinStart); @@ -362,6 +398,20 @@ void LLToolGrab::startGrab() // drag from center LLVector3d grab_start_global = root->getPositionGlobal(); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsFartouch + && !objectp->isHUDAttachment()) + { +// LLVector3 pos = objectp->getPositionRegion (); + LLVector3 pos = mGrabPick.mIntersection; + pos -= gAgent.getPositionAgent (); + if (pos.magVec () >= 1.5) + { + return; + } + } +//mk + // Where the grab starts, relative to the center of the root object of the set. // JC - This code looks wonky, but I believe it does the right thing. // Otherwise, when you grab a linked object set, it "pops" on the start @@ -466,6 +516,22 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask) return; } +//MK + if (RRenabled && gAgent.mRRInterface.mContainsFartouch) + { + if (objectp && !objectp->isHUDAttachment()) + { +// LLVector3 pos = objectp->getPositionRegion (); + LLVector3 pos = mGrabPick.mIntersection; + pos -= gAgent.getPositionAgent (); + if (pos.magVec () >= 1.5) + { + return; + } + } + } +//mk + //-------------------------------------------------- // Toggle spinning //-------------------------------------------------- @@ -1037,6 +1103,22 @@ void LLToolGrab::stopGrab() return; } +//MK + if (RRenabled && gAgent.mRRInterface.mContainsFartouch) + { + if (objectp && !objectp->isHUDAttachment()) + { +// LLVector3 pos = objectp->getPositionRegion (); + LLVector3 pos = mGrabPick.mIntersection; + pos -= gAgent.getPositionAgent (); + if (pos.magVec () >= 1.5) + { + return; + } + } + } +//mk + LLPickInfo pick = mGrabPick; if (mMode == GRAB_NONPHYSICAL) diff --git a/linden/indra/newview/lltoolmorph.cpp b/linden/indra/newview/lltoolmorph.cpp index a23b4ce..a5e6e66 100644 --- a/linden/indra/newview/lltoolmorph.cpp +++ b/linden/indra/newview/lltoolmorph.cpp @@ -236,7 +236,11 @@ BOOL LLVisualParamHint::render() { LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)avatarp->mDrawable->getFace(0)->getPool(); LLGLDepthTest gls_depth(GL_TRUE, GL_TRUE); + gGL.setAlphaRejectSettings(LLRender::CF_ALWAYS); + gGL.setSceneBlendType(LLRender::BT_REPLACE); avatarPoolp->renderAvatars(avatarp); // renders only one avatar + gGL.setSceneBlendType(LLRender::BT_ALPHA); + gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); } avatarp->setVisualParamWeight(mVisualParam, mLastParamWeight); gGL.color4f(1,1,1,1); diff --git a/linden/indra/newview/lltoolpie.cpp b/linden/indra/newview/lltoolpie.cpp index 0f49bae..467f665 100644 --- a/linden/indra/newview/lltoolpie.cpp +++ b/linden/indra/newview/lltoolpie.cpp @@ -67,6 +67,10 @@ #include "llui.h" #include "llweb.h" +//MK +extern BOOL RRenabled; +//mk + extern void handle_buy(void*); extern BOOL gDebugClicks; @@ -102,6 +106,16 @@ void LLToolPie::leftMouseCallback(const LLPickInfo& pick_info) BOOL LLToolPie::handleRightMouseDown(S32 x, S32 y, MASK mask) { +//MK + // HACK : if alt-right-clicking and not in mouselook, HUDs are passed through and we risk + // right-clicking in-world + // => discard this click + if (RRenabled && (mask & MASK_ALT) && gAgent.getCameraMode() != CAMERA_MODE_MOUSELOOK) + { + handleMouseDown (x, y, mask); + return TRUE; + } +//mk // don't pick transparent so users can't "pay" transparent objects gViewerWindow->pickAsync(x, y, mask, rightMouseCallback, FALSE, TRUE); mPieMouseButtonDown = TRUE; @@ -137,8 +151,13 @@ BOOL LLToolPie::pickAndShowMenu(BOOL always_show) } else { - // not selling passes, get info - LLFloaterLand::showInstance(); +//MK + if (!RRenabled || !gAgent.mRRInterface.mContainsShowloc) + { +//mk + // not selling passes, get info + LLFloaterLand::showInstance(); + } } } @@ -165,6 +184,18 @@ BOOL LLToolPie::pickAndShowMenu(BOOL always_show) // If it's a left-click, and we have a special action, do it. if (useClickAction(always_show, mask, object, parent)) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsFartouch) + { + LLVector3 pos = mPick.mIntersection; + pos -= gAgent.getPositionAgent (); + if (pos.magVec () >= 1.5) + { + return true; + } + } +//mk + mClickAction = 0; if (object && object->getClickAction()) { @@ -633,10 +664,14 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask) && !mPick.mPosGlobal.isExactlyZero()) { // Hit an object - // HACK: Call the last hit position the point we hit on the object - //gLastHitPosGlobal += gLastHitObjectOffset; - handle_go_to(); - return TRUE; + // Do not go to attachments... + if (!mPick.getObject()->isHUDAttachment()) + { + // HACK: Call the last hit position the point we hit on the object + //gLastHitPosGlobal += gLastHitObjectOffset; + handle_go_to(); + return TRUE; + } } } diff --git a/linden/indra/newview/lltoolplacer.cpp b/linden/indra/newview/lltoolplacer.cpp index dda21dd..4079aee 100644 --- a/linden/indra/newview/lltoolplacer.cpp +++ b/linden/indra/newview/lltoolplacer.cpp @@ -38,6 +38,9 @@ #include "llprimitive.h" // viewer headers +//MK +#include "llagent.h" +//mk #include "llbutton.h" #include "llviewercontrol.h" #include "llfirstuse.h" @@ -48,6 +51,8 @@ #include "lltoolmgr.h" #include "llviewerobject.h" #include "llviewerregion.h" +#include "llparcel.h" +#include "llviewerparcelmgr.h" #include "llviewerwindow.h" #include "llworld.h" #include "llui.h" @@ -66,6 +71,10 @@ const LLVector3 DEFAULT_OBJECT_SCALE(0.5f, 0.5f, 0.5f); +//MK +extern BOOL RRenabled; +//mk + //static LLPCode LLToolPlacer::sObjectType = LL_PCODE_CUBE; @@ -232,7 +241,30 @@ BOOL LLToolPlacer::addObject( LLPCode pcode, S32 x, S32 y, U8 use_physics ) gMessageSystem->nextBlockFast(_PREHASH_AgentData); gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - gMessageSystem->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID()); + + // RezWithLandGroup 2009-05, If avatar is in land group/land owner group, + // it rezzes it with it to prevent autoreturn/whatever + if ( gSavedSettings.getBOOL("RezWithLandGroup") ) + { + LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); + if ( gAgent.isInGroup(parcel->getGroupID()) ) + { + gMessageSystem->addUUIDFast(_PREHASH_GroupID, parcel->getGroupID()); + } + else if ( gAgent.isInGroup(parcel->getOwnerID()) ) + { + gMessageSystem->addUUIDFast(_PREHASH_GroupID, parcel->getOwnerID()); + } + else + { + gMessageSystem->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID()); + } + } + else + { + gMessageSystem->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID()); + } + gMessageSystem->nextBlockFast(_PREHASH_ObjectData); gMessageSystem->addU8Fast(_PREHASH_Material, material); @@ -498,6 +530,13 @@ BOOL LLToolPlacer::addDuplicate(S32 x, S32 y) BOOL LLToolPlacer::placeObject(S32 x, S32 y, MASK mask) { BOOL added = TRUE; + +//MK + if (RRenabled && (gAgent.mRRInterface.mContainsEdit || gAgent.mRRInterface.mContainsRez)) + { + return TRUE; + } +//mk if (gSavedSettings.getBOOL("CreateToolCopySelection")) { diff --git a/linden/indra/newview/lltoolselect.cpp b/linden/indra/newview/lltoolselect.cpp index b4e9562..46d4cb9 100644 --- a/linden/indra/newview/lltoolselect.cpp +++ b/linden/indra/newview/lltoolselect.cpp @@ -52,6 +52,9 @@ // Globals extern BOOL gAllowSelectAvatar; +//MK +extern BOOL RRenabled; +//mk const F32 SELECTION_ROTATION_TRESHOLD = 0.1f; @@ -64,9 +67,30 @@ LLToolSelect::LLToolSelect( LLToolComposite* composite ) // True if you selected an object. BOOL LLToolSelect::handleMouseDown(S32 x, S32 y, MASK mask) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsEdit) + { + return FALSE; + } +//mk // do immediate pick query mPick = gViewerWindow->pickImmediate(x, y, TRUE); - +//MK + LLViewerObject* object = mPick.getObject(); + if (object) + { + if (RRenabled && gAgent.mRRInterface.mContainsFartouch) + { +// LLVector3 pos = object->getPositionRegion (); + LLVector3 pos = mPick.mIntersection; + pos -= gAgent.getPositionAgent (); + if (pos.magVec () >= 1.5) + { + return FALSE; + } + } + } +//mk // Pass mousedown to agent LLTool::handleMouseDown(x, y, mask); @@ -77,11 +101,32 @@ BOOL LLToolSelect::handleMouseDown(S32 x, S32 y, MASK mask) // static LLObjectSelectionHandle LLToolSelect::handleObjectSelection(const LLPickInfo& pick, BOOL ignore_group, BOOL temp_select, BOOL select_root) { +//MK + if (RRenabled && !temp_select && gAgent.mRRInterface.mContainsEdit) + { + return FALSE; + } +//mk LLViewerObject* object = pick.getObject(); if (select_root) { object = object->getRootEdit(); } +//MK + if (object) + { + if (RRenabled && gAgent.mRRInterface.mContainsFartouch && !object->isHUDAttachment()) + { + LLVector3 pos = object->getPositionRegion (); +// LLVector3 pos = pick.mIntersection; + pos -= gAgent.getPositionAgent (); + if (pos.magVec () >= 1.5) + { + return FALSE; + } + } + } +//mk BOOL select_owned = gSavedSettings.getBOOL("SelectOwnedOnly"); BOOL select_movable = gSavedSettings.getBOOL("SelectMovableOnly"); diff --git a/linden/indra/newview/lltracker.cpp b/linden/indra/newview/lltracker.cpp index bd2f659..8c3fc34 100644 --- a/linden/indra/newview/lltracker.cpp +++ b/linden/indra/newview/lltracker.cpp @@ -75,6 +75,10 @@ const S32 ARROW_OFF_RADIUS_SQRD = 100; const S32 HUD_ARROW_SIZE = 32; +//MK +extern BOOL RRenabled; +//mk + // static LLTracker *LLTracker::sTrackerp = NULL; BOOL LLTracker::sCheesyBeacon = FALSE; @@ -161,6 +165,13 @@ void LLTracker::render3D() return; } +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + instance()->mTrackedLocationName = ""; + } +//mk + // Arbitary location beacon if( instance()->mIsTrackingLocation ) { diff --git a/linden/indra/newview/llurlsimstring.cpp b/linden/indra/newview/llurlsimstring.cpp index 6f1baed..e5d8df4 100644 --- a/linden/indra/newview/llurlsimstring.cpp +++ b/linden/indra/newview/llurlsimstring.cpp @@ -52,6 +52,12 @@ void LLURLSimString::setString(const std::string& sim_string) sInstance.mSimString.clear(); sInstance.mSimName.clear(); sInstance.mParseState = NOT_PARSED; +//MK + if (gSavedSettings.getBOOL("RestrainedLove")) + { + return; + } +//mk if (sim_string == sLocationStringHome) { gSavedSettings.setBOOL("LoginLastLocation", FALSE); diff --git a/linden/indra/newview/llviewercontrol.cpp b/linden/indra/newview/llviewercontrol.cpp index df39ee7..d0a23be 100644 --- a/linden/indra/newview/llviewercontrol.cpp +++ b/linden/indra/newview/llviewercontrol.cpp @@ -118,6 +118,49 @@ static bool handleSetShaderChanged(const LLSD& newvalue) return true; } +static bool handleAvatarBoobMassChanged(const LLSD& newvalue) +{ + LLVOAvatar::sBoobConfig.mass = EmeraldBoobUtils::convertMass((F32) newvalue.asReal()); + return true; +} + +static bool handleAvatarBoobHardnessChanged(const LLSD& newvalue) +{ + LLVOAvatar::sBoobConfig.hardness = EmeraldBoobUtils::convertHardness((F32) newvalue.asReal()); + return true; +} + +static bool handleAvatarBoobVelMaxChanged(const LLSD& newvalue) +{ + LLVOAvatar::sBoobConfig.velMax = EmeraldBoobUtils::convertVelMax((F32) newvalue.asReal()); + LLVOAvatar::sBoobConfig.velMin = LLVOAvatar::sBoobConfig.velMin*LLVOAvatar::sBoobConfig.velMax; + return true; +} + +static bool handleAvatarBoobFrictionChanged(const LLSD& newvalue) +{ + LLVOAvatar::sBoobConfig.friction = EmeraldBoobUtils::convertFriction((F32) newvalue.asReal()); + return true; +} + +static bool handleAvatarBoobVelMinChanged(const LLSD& newvalue) +{ + LLVOAvatar::sBoobConfig.velMin = EmeraldBoobUtils::convertVelMin((F32) newvalue.asReal())*LLVOAvatar::sBoobConfig.velMax; + return true; +} + +static bool handleAvatarBoobToggleChanged(const LLSD& newvalue) +{ + LLVOAvatar::sBoobConfig.enabled = (BOOL) newvalue.asReal(); + return true; +} + +static bool handleAvatarBoobXYInfluence(const LLSD& newvalue) +{ + LLVOAvatar::sBoobConfig.XYInfluence = (F32) newvalue.asReal(); + return true; +} + static bool handleReleaseGLBufferChanged(const LLSD& newvalue) { if (gPipeline.isInit()) @@ -453,6 +496,14 @@ void settings_setup_listeners() gSavedSettings.getControl("RenderFlexTimeFactor")->getSignal()->connect(boost::bind(&handleFlexLODChanged, _1)); gSavedSettings.getControl("ThrottleBandwidthKBPS")->getSignal()->connect(boost::bind(&handleBandwidthChanged, _1)); gSavedSettings.getControl("RenderGamma")->getSignal()->connect(boost::bind(&handleGammaChanged, _1)); + gSavedSettings.getControl("EmeraldBoobMass")->getSignal()->connect(boost::bind(&handleAvatarBoobMassChanged, _1)); + gSavedSettings.getControl("EmeraldBoobHardness")->getSignal()->connect(boost::bind(&handleAvatarBoobHardnessChanged, _1)); + gSavedSettings.getControl("EmeraldBoobVelMax")->getSignal()->connect(boost::bind(&handleAvatarBoobVelMaxChanged, _1)); + gSavedSettings.getControl("EmeraldBoobFriction")->getSignal()->connect(boost::bind(&handleAvatarBoobFrictionChanged, _1)); + gSavedSettings.getControl("EmeraldBoobVelMin")->getSignal()->connect(boost::bind(&handleAvatarBoobVelMinChanged, _1)); + gSavedSettings.getControl("EmeraldBreastPhysicsToggle")->getSignal()->connect(boost::bind(&handleAvatarBoobToggleChanged, _1)); + gSavedSettings.getControl("EmeraldBoobXYInfluence")->getSignal()->connect(boost::bind(&handleAvatarBoobXYInfluence, _1)); + gSavedSettings.getControl("RenderFogRatio")->getSignal()->connect(boost::bind(&handleFogRatioChanged, _1)); gSavedSettings.getControl("RenderMaxPartCount")->getSignal()->connect(boost::bind(&handleMaxPartCountChanged, _1)); gSavedSettings.getControl("RenderDynamicLOD")->getSignal()->connect(boost::bind(&handleRenderDynamicLODChanged, _1)); diff --git a/linden/indra/newview/llviewerdisplay.cpp b/linden/indra/newview/llviewerdisplay.cpp index 96591a2..f8de7ab 100644 --- a/linden/indra/newview/llviewerdisplay.cpp +++ b/linden/indra/newview/llviewerdisplay.cpp @@ -83,6 +83,9 @@ #include "llpostprocess.h" extern LLPointer gStartImageGL; +//MK +extern BOOL RRenabled; +//mk LLPointer gDisconnectedImagep = NULL; @@ -92,6 +95,7 @@ const F32 TELEPORT_ARRIVAL_DELAY = 2.f; // Time to preload the world before rais BOOL gTeleportDisplay = FALSE; LLFrameTimer gTeleportDisplayTimer; LLFrameTimer gTeleportArrivalTimer; +F32 gSavedDrawDistance = 0.0f; const F32 RESTORE_GL_TIME = 5.f; // Wait this long while reloading textures before we raise the curtain BOOL gForceRenderLandFence = FALSE; @@ -396,6 +400,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) case LLAgent::TELEPORT_NONE: // No teleport in progress gViewerWindow->setShowProgress(FALSE); + gTeleportArrivalTimer.reset(); gTeleportDisplay = FALSE; break; } @@ -438,6 +443,31 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) } } + // Progressively increase draw distance after TP when required. + if (gSavedDrawDistance > 0.0f && gAgent.getTeleportState() == LLAgent::TELEPORT_NONE) + { + if (gTeleportArrivalTimer.getElapsedTimeF32() >= + (F32)gSavedSettings.getU32("SpeedRezInterval")) + { + gTeleportArrivalTimer.reset(); + F32 current = gSavedSettings.getF32("RenderFarClip"); + if (gSavedDrawDistance > current) + { + current *= 2.0; + if (current > gSavedDrawDistance) + { + current = gSavedDrawDistance; + } + gSavedSettings.setF32("RenderFarClip", current); + } + if (current >= gSavedDrawDistance) + { + gSavedDrawDistance = 0.0f; + gSavedSettings.setF32("SavedRenderFarClip", 0.0f); + } + } + } + ////////////////////////// // // Prepare for the next frame @@ -504,7 +534,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) } gViewerWindow->setupViewport(); - + + gPipeline.resetFrameStats(); // Reset per-frame statistics. if (!gDisconnected) { LLAppViewer::instance()->pingMainloopTimeout("Display:Update"); @@ -552,7 +583,10 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) LLSpatialGroup::sNoDelete = TRUE; LLPipeline::sUseOcclusion = - (!gUseWireframe + ((!gUseWireframe +//MK + || (RRenabled && gAgent.mRRInterface.mContainsDetach)) +//mk && LLFeatureManager::getInstance()->isFeatureAvailable("UseOcclusion") && gSavedSettings.getBOOL("UseOcclusion") && gGLManager.mHasOcclusionQuery) ? 2 : 0; @@ -567,10 +601,18 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) } gDepthDirty = FALSE; + LLGLState::checkStates(); + LLGLState::checkTextureChannels(); + LLGLState::checkClientArrays(); + static LLCullResult result; gPipeline.updateCull(*LLViewerCamera::getInstance(), result, water_clip); stop_glerror(); + LLGLState::checkStates(); + LLGLState::checkTextureChannels(); + LLGLState::checkClientArrays(); + BOOL to_texture = !for_snapshot && gPipeline.canUseVertexShaders() && LLPipeline::sRenderGlow; @@ -592,9 +634,16 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) gGL.setColorMask(true, true); glClearColor(0,0,0,0); - + + LLGLState::checkStates(); + LLGLState::checkTextureChannels(); + LLGLState::checkClientArrays(); + if (!for_snapshot) { + LLGLState::checkStates(); + LLGLState::checkTextureChannels(); + LLGLState::checkClientArrays(); glh::matrix4f proj = glh_get_current_projection(); glh::matrix4f mod = glh_get_current_modelview(); glViewport(0,0,512,512); @@ -607,6 +656,11 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) glMatrixMode(GL_MODELVIEW); glLoadMatrixf(mod.m); gViewerWindow->setupViewport(); + + LLGLState::checkStates(); + LLGLState::checkTextureChannels(); + LLGLState::checkClientArrays(); + } glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); } @@ -675,7 +729,9 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) gSky.updateSky(); } - if(gUseWireframe) +//MK + if(gUseWireframe && (!RRenabled || !gAgent.mRRInterface.mContainsDetach)) +//mk { glClearColor(0.5f, 0.5f, 0.5f, 0.f); glClear(GL_COLOR_BUFFER_BIT); @@ -802,7 +858,14 @@ void render_hud_attachments() glh::matrix4f current_mod = glh_get_current_modelview(); // clamp target zoom level to reasonable values - gAgent.mHUDTargetZoom = llclamp(gAgent.mHUDTargetZoom, 0.1f, 1.f); +//MK + if (RRenabled && gAgent.mRRInterface.mHasLockedHuds) + { + gAgent.mHUDTargetZoom = llclamp(gAgent.mHUDTargetZoom, 0.85f, 1.f); + } + else +//mk + gAgent.mHUDTargetZoom = llclamp(gAgent.mHUDTargetZoom, 0.1f, 1.f); // smoothly interpolate current zoom level gAgent.mHUDCurZoom = lerp(gAgent.mHUDCurZoom, gAgent.mHUDTargetZoom, LLCriticalDamp::getInterpolant(0.03f)); diff --git a/linden/indra/newview/llviewerdisplay.h b/linden/indra/newview/llviewerdisplay.h index 3f954fd..6f54469 100644 --- a/linden/indra/newview/llviewerdisplay.h +++ b/linden/indra/newview/llviewerdisplay.h @@ -45,5 +45,5 @@ extern BOOL gTeleportDisplay; extern LLFrameTimer gTeleportDisplayTimer; extern BOOL gForceRenderLandFence; extern BOOL gResizeScreenTexture; - +extern F32 gSavedDrawDistance; #endif // LL_LLVIEWERDISPLAY_H diff --git a/linden/indra/newview/llviewergesture.cpp b/linden/indra/newview/llviewergesture.cpp index 139fd99..90df4b3 100644 --- a/linden/indra/newview/llviewergesture.cpp +++ b/linden/indra/newview/llviewergesture.cpp @@ -47,6 +47,10 @@ #include "llviewernetwork.h" #include "llagent.h" +//MK +extern BOOL RRenabled; +//mk + // Globals LLViewerGestureList gGestureList; @@ -135,7 +139,12 @@ void LLViewerGesture::doTrigger( BOOL send_chat ) { // Don't play nodding animation, since that might not blend // with the gesture animation. - gChatBar->sendChatFromViewer(mOutputString, CHAT_TYPE_NORMAL, FALSE); +//MK + if (!RRenabled || !gAgent.mRRInterface.contains ("sendchat")) + { +//mk + gChatBar->sendChatFromViewer(mOutputString, CHAT_TYPE_NORMAL, FALSE); + } } } diff --git a/linden/indra/newview/llviewerjointattachment.cpp b/linden/indra/newview/llviewerjointattachment.cpp index 2517250..74ee11a 100644 --- a/linden/indra/newview/llviewerjointattachment.cpp +++ b/linden/indra/newview/llviewerjointattachment.cpp @@ -50,6 +50,12 @@ #include "llglheaders.h" +//MK +#include "llinventoryview.h" +#include "llagent.h" +extern BOOL RRenabled; +//mk + extern LLPipeline gPipeline; //----------------------------------------------------------------------------- @@ -156,8 +162,14 @@ void LLViewerJointAttachment::setupDrawable(LLDrawable* drawablep) //----------------------------------------------------------------------------- BOOL LLViewerJointAttachment::addObject(LLViewerObject* object) { +//MK + BOOL was_empty = true; +//mk if (mAttachedObject) { +//MK + was_empty = false; +//mk llwarns << "Attempted to attach object where an attachment already exists!" << llendl; if (mAttachedObject == object) { @@ -225,6 +237,70 @@ BOOL LLViewerJointAttachment::addObject(LLViewerObject* object) calcLOD(); mUpdateXform = TRUE; +//MK + if (RRenabled) + { + // If this attachment point is locked and empty, then force detach, unless the attached object was supposed to be reattached automatically + if (was_empty) + { + std::string name = getName(); + LLStringUtil::toLower(name); + if (!gAgent.mRRInterface.canAttach(object, name)) + { + bool just_reattaching = false; + std::deque::iterator it = gAgent.mRRInterface.sAssetsToReattach.begin(); + for (; it != gAgent.mRRInterface.sAssetsToReattach.end(); ++it) + { + if (it->uuid == item_id) + { + just_reattaching = true; + break; + } + } + if (!just_reattaching) + { + llinfos << "Attached to a locked point : " << mItemID << llendl; + gMessageSystem->newMessage("ObjectDetach"); + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + gMessageSystem->nextBlockFast(_PREHASH_ObjectData); + gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID()); + gMessageSystem->sendReliable( gAgent.getRegionHost() ); + + gAgent.mRRInterface.sJustDetached.uuid = item_id; + gAgent.mRRInterface.sJustDetached.attachpt = getName(); + } + } + } + + // If the UUID of the attached item is contained into the list of things waiting to reattach, + // signal it and remove it from the list (and if the list is not empty, restart the timer for the next). + std::deque::iterator it = gAgent.mRRInterface.sAssetsToReattach.begin(); + for (; it != gAgent.mRRInterface.sAssetsToReattach.end(); ++it) + { + if (it->uuid == item_id) + { + llinfos << "Reattached asset " << item_id << " automatically" << llendl; + gAgent.mRRInterface.sAssetsToReattach.erase(it); +// gAgent.mRRInterface.sJustReattached.uuid = item_id; +// gAgent.mRRInterface.sJustReattached.attachpt = getName(); + // Replace the previously stored asset id with the new viewer id in the list of restrictions + gAgent.mRRInterface.replace(item_id, object->getRootEdit()->getID()); + if (!gAgent.mRRInterface.sAssetsToReattach.empty()) + { + gAgent.mRRInterface.sTimeBeforeReattaching = 50; // let's wait a little before reattaching the next item + } + else + { + gAgent.mRRInterface.sTimeBeforeReattaching = 0; + } + break; + } + } + } +//mk + return TRUE; } @@ -233,6 +309,51 @@ BOOL LLViewerJointAttachment::addObject(LLViewerObject* object) //----------------------------------------------------------------------------- void LLViewerJointAttachment::removeObject(LLViewerObject *object) { +//MK + if (RRenabled) + { + // We first need to check whether the object is locked, as some techniques (like llAttachToAvatar) + // can kick even a locked attachment off. + // If so, retain its UUID for later + // Note : we need to delay the reattach a little, or we risk losing the item in the inventory. + LLVOAvatar *avatarp = gAgent.getAvatarObject(); + LLUUID inv_item_id = LLUUID::null; + LLInventoryItem* inv_item = gAgent.mRRInterface.getItem(object->getRootEdit()->getID()); + if (inv_item) inv_item_id = inv_item->getUUID(); + std::string target_attachpt = ""; + if (avatarp) target_attachpt = avatarp->getAttachedPointName(inv_item_id); + if (!gAgent.mRRInterface.canDetach(object) + && gAgent.mRRInterface.sJustDetached.attachpt != target_attachpt // we didn't just detach something from this attach pt automatically + && gAgent.mRRInterface.sJustReattached.attachpt != target_attachpt) // we didn't just reattach something to this attach pt automatically + { + llinfos << "Detached a locked object : " << mItemID << llendl; + + std::deque::iterator it = gAgent.mRRInterface.sAssetsToReattach.begin(); + bool found = false; + bool found_for_this_point = false; + for (; it != gAgent.mRRInterface.sAssetsToReattach.end(); ++it) + { + if (it->uuid == mItemID) found = true; + if (it->attachpt == target_attachpt) found_for_this_point = true; + } + + if (!found && !found_for_this_point) + { + AssetAndTarget at; + at.uuid = mItemID; + at.attachpt = target_attachpt; + gAgent.mRRInterface.sTimeBeforeReattaching = 50; // number of cycles before triggering the reattach (approx 5 seconds) + gAgent.mRRInterface.sAssetsToReattach.push_back(at); + // Little hack : store this item's asset id into the list of restrictions so they are automatically reapplied when it is reattached + gAgent.mRRInterface.replace(object->getRootEdit()->getID(), mItemID); + } + } + gAgent.mRRInterface.sJustDetached.uuid.setNull(); + gAgent.mRRInterface.sJustDetached.attachpt = ""; + gAgent.mRRInterface.sJustReattached.uuid.setNull(); + gAgent.mRRInterface.sJustReattached.attachpt = ""; + } +//mk // force object visibile setAttachmentVisibility(TRUE); diff --git a/linden/indra/newview/llviewerjointmesh.cpp b/linden/indra/newview/llviewerjointmesh.cpp index be24386..60600b4 100644 --- a/linden/indra/newview/llviewerjointmesh.cpp +++ b/linden/indra/newview/llviewerjointmesh.cpp @@ -838,9 +838,20 @@ void (*LLViewerJointMesh::sUpdateGeometryFunc)(LLFace* face, LLPolyMesh* mesh); void LLViewerJointMesh::updateVectorize() { sVectorizePerfTest = gSavedSettings.getBOOL("VectorizePerfTest"); - sVectorizeProcessor = gSavedSettings.getU32("VectorizeProcessor"); BOOL vectorizeEnable = gSavedSettings.getBOOL("VectorizeEnable"); BOOL vectorizeSkin = gSavedSettings.getBOOL("VectorizeSkin"); + if (sVectorizePerfTest) { + // get CPUInfos to ask hasSSE | hasSSE2 if cpu supports sse|sse2 + LLCPUInfo CPUInfo; + llinfos << "CPU supports SSE " << ( CPUInfo.hasSSE() ? "TRUE" : "FALSE" ) << llendl; + llinfos << "CPU supports SSE2 " << ( CPUInfo.hasSSE2() ? "TRUE" : "FALSE" ) << llendl; + if (CPUInfo.hasSSE() && CPUInfo.hasSSE2()) { sVectorizeProcessor = 2; } + if (CPUInfo.hasSSE() && !sVectorizeProcessor) { sVectorizeProcessor = 1; } + if (sVectorizeProcessor != 0) { + vectorizeEnable = 1; + vectorizeSkin = 1; + } + } std::string vp; switch(sVectorizeProcessor) diff --git a/linden/indra/newview/llviewermenu.cpp b/linden/indra/newview/llviewermenu.cpp index 6a69960..9491689 100644 --- a/linden/indra/newview/llviewermenu.cpp +++ b/linden/indra/newview/llviewermenu.cpp @@ -221,6 +221,9 @@ void init_debug_rendering_menu(LLMenuGL* menu); void init_debug_ui_menu(LLMenuGL* menu); void init_debug_xui_menu(LLMenuGL* menu); void init_debug_avatar_menu(LLMenuGL* menu); +//MK +void init_restrained_love_menu(LLMenuGL* menu); +//mk void init_debug_baked_texture_menu(LLMenuGL* menu); BOOL enable_land_build(void*); @@ -240,6 +243,9 @@ extern BOOL gHideSelectedObjects; extern BOOL gShowOverlayTitle; extern BOOL gOcclusionCull; extern BOOL gAllowSelectAvatar; +//MK +extern BOOL RRenabled; +//mk // // Globals @@ -844,7 +850,14 @@ void init_client_menu(LLMenuGL* menu) sub_menu = new LLMenuGL("Character"); init_debug_avatar_menu(sub_menu); menu->appendMenu(sub_menu); - +//MK + if (RRenabled) + { + sub_menu = new LLMenuGL("RestrainedLove"); + init_restrained_love_menu(sub_menu); + menu->appendMenu(sub_menu); + } +//mk { LLMenuGL* sub = NULL; sub = new LLMenuGL("Network"); @@ -957,12 +970,18 @@ void init_client_menu(LLMenuGL* menu) (void*)"SaveMinidump")); // TomY Temporary menu item so we can test this floater - menu->append(new LLMenuItemCheckGL("Clothing...", +//MK + if (!RRenabled) + { +//mk + menu->append(new LLMenuItemCheckGL("Clothing...", &handle_clothing, NULL, NULL, NULL)); - +//MK + } +//mk menu->append(new LLMenuItemCallGL("Debug Settings...", LLFloaterSettingsDebug::show, NULL, NULL, 'S', MASK_ALT | MASK_CONTROL)); menu->append(new LLMenuItemCheckGL("View Admin Options", &handle_admin_override_toggle, NULL, &check_admin_override, NULL, 'V', MASK_CONTROL | MASK_ALT)); @@ -1369,10 +1388,19 @@ void init_debug_avatar_menu(LLMenuGL* menu) #endif menu->createJumpKeys(); } - +//MK +void init_restrained_love_menu(LLMenuGL* menu) +{ + menu->append(new LLMenuItemCheckGL("Allow Wear", menu_toggle_control, NULL, menu_check_control, (void*) "RestrainedLoveAllowWear")); + menu->append(new LLMenuItemCheckGL("Forbid give to #RLV/", menu_toggle_control, NULL, menu_check_control, (void*) "RestrainedLoveForbidGiveToRLV")); + menu->append(new LLMenuItemCheckGL("Ignore @setenv (after restart)", menu_toggle_control, NULL, menu_check_control, (void*) "RestrainedLoveNoSetEnv")); + menu->append(new LLMenuItemCheckGL("Debug mode", menu_toggle_control, NULL, menu_check_control, (void*) "RestrainedLoveDebug")); +} +//mk void init_debug_baked_texture_menu(LLMenuGL* menu) { menu->append(new LLMenuItemCallGL("Iris", handle_grab_texture, enable_grab_texture, (void*) LLVOAvatar::TEX_EYES_BAKED)); + menu->append(new LLMenuItemCallGL("Hair", handle_grab_texture, enable_grab_texture, (void*) LLVOAvatar::TEX_HAIR_BAKED)); menu->append(new LLMenuItemCallGL("Head", handle_grab_texture, enable_grab_texture, (void*) LLVOAvatar::TEX_HEAD_BAKED)); menu->append(new LLMenuItemCallGL("Upper Body", handle_grab_texture, enable_grab_texture, (void*) LLVOAvatar::TEX_UPPER_BAKED)); menu->append(new LLMenuItemCallGL("Lower Body", handle_grab_texture, enable_grab_texture, (void*) LLVOAvatar::TEX_LOWER_BAKED)); @@ -1529,6 +1557,19 @@ class LLObjectTouch : public view_listener_t LLPickInfo pick = LLToolPie::getInstance()->getPick(); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsFartouch) + { +// LLVector3 pos = object->getPositionRegion (); + LLVector3 pos = pick.mIntersection; + pos -= gAgent.getPositionAgent (); + if (pos.magVec () >= 1.5) + { + return true; + } + } +//mk + LLMessageSystem *msg = gMessageSystem; msg->newMessageFast(_PREHASH_ObjectGrab); @@ -1611,6 +1652,18 @@ bool handle_object_open() { LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); if(!obj) return true; +//MK + if (RRenabled && gAgent.mRRInterface.mContainsFartouch) + { +// LLVector3 pos = obj->getPositionRegion (); + LLVector3 pos = LLToolPie::getInstance()->getPick().mIntersection; + pos -= gAgent.getPositionAgent (); + if (pos.magVec () >= 1.5) + { + return true; + } + } +//mk LLFloaterOpenObject::show(); return true; @@ -1620,6 +1673,12 @@ class LLObjectOpen : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsEdit) + { + return true; + } +//mk return handle_object_open(); } }; @@ -1634,6 +1693,18 @@ class LLObjectEnableOpen : public view_listener_t bool new_value = (obj != NULL); if (new_value) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsFartouch) + { +// LLVector3 pos = obj->getPositionRegion (); + LLVector3 pos = LLToolPie::getInstance()->getPick().mIntersection; + pos -= gAgent.getPositionAgent (); + if (pos.magVec () >= 1.5) + { + return true; + } + } +//mk LLViewerObject* root = obj->getRootEdit(); if (!root) new_value = false; else new_value = root->allowOpen(); @@ -1675,6 +1746,12 @@ bool toggle_build_mode() } else { +//MK + if (RRenabled && (gAgent.mRRInterface.mContainsRez || gAgent.mRRInterface.mContainsEdit)) + { + return false; + } +//mk ECameraMode camMode = gAgent.getCameraMode(); if (CAMERA_MODE_MOUSELOOK == camMode || CAMERA_MODE_CUSTOMIZE_AVATAR == camMode) { @@ -1744,23 +1821,6 @@ class LLViewCheckJoystickFlycam : public view_listener_t } }; -class LLViewCommunicate : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - if (LLFloaterChatterBox::getInstance()->getFloaterCount() == 0) - { - LLFloaterMyFriends::toggleInstance(); - } - else - { - LLFloaterChatterBox::toggleInstance(); - } - return true; - } -}; - - void handle_toggle_flycam() { LLViewerJoystick::getInstance()->toggleFlycam(); @@ -1770,6 +1830,12 @@ class LLObjectBuild : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && (gAgent.mRRInterface.mContainsRez || gAgent.mRRInterface.mContainsEdit)) + { + return false; + } +//mk if (gAgent.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit() && gSavedSettings.getBOOL("EditCameraMovement") ) { // zoom in if we're looking at the avatar @@ -1798,6 +1864,27 @@ class LLObjectEdit : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsEdit) + { + return false; + } + + if (RRenabled && gAgent.mRRInterface.mContainsFartouch + && LLSelectMgr::getInstance()->getSelection()->getFirstObject() +// && LLSelectMgr::getInstance()->getSelection()->getSelectType() != SELECT_TYPE_HUD + && !LLSelectMgr::getInstance()->getSelection()->getFirstObject()->isHUDAttachment() + ) + { +// LLVector3 pos = LLSelectMgr::getInstance()->getSelection()->getFirstObject()->getPositionRegion (); + LLVector3 pos = LLToolPie::getInstance()->getPick().mIntersection; + pos -= gAgent.getPositionAgent (); + if (pos.magVec () >= 1.5) + { + return false; + } + } +//mk LLViewerParcelMgr::getInstance()->deselectLand(); if (gAgent.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit()) @@ -1844,6 +1931,12 @@ class LLObjectInspect : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + return false; + } +//mk LLFloaterInspect::show(); return true; } @@ -1857,6 +1950,12 @@ class LLLandBuild : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && (gAgent.mRRInterface.mContainsRez || gAgent.mRRInterface.mContainsEdit)) + { + return false; + } +//mk LLViewerParcelMgr::getInstance()->deselectLand(); if (gAgent.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit() && gSavedSettings.getBOOL("EditCameraMovement") ) @@ -1958,6 +2057,12 @@ class LLSelfRemoveAllAttachments : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsDetach) + { + return false; + } +//mk LLAgent::userRemoveAllAttachments(NULL); return true; } @@ -1967,6 +2072,12 @@ class LLSelfEnableRemoveAllAttachments : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsDetach) + { + return false; + } +//mk bool new_value = false; if (gAgent.getAvatarObject()) { @@ -2011,6 +2122,12 @@ class LLObjectEnableMute : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + return false; + } +//mk LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); bool new_value = (object != NULL); if (new_value) @@ -2043,6 +2160,12 @@ class LLObjectMute : public view_listener_t LLVOAvatar* avatar = find_avatar_from_object(object); if (avatar) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + return false; + } +//mk id = avatar->getID(); LLNameValue *firstname = avatar->getNVPair("FirstName"); @@ -2087,8 +2210,20 @@ class LLObjectMute : public view_listener_t bool handle_go_to() { +//MK + if (RRenabled && gAgent.isControlGrabbed(CONTROL_AT_POS_INDEX)) + { + // When llTakeControls() has been performed on CONTROL_FWD, + // do not allow the go to action to prevent overriding any + // speed limitation or movement restriction. + return true; + } +//mk LLVector3d pos = LLToolPie::getInstance()->getPick().mPosGlobal; - if (gSavedSettings.getBOOL("DoubleClickTeleport")) + if (gSavedSettings.getBOOL("DoubleClickTeleport") +//MK + && !(RRenabled && gAgent.mRRInterface.contains ("tploc"))) +//mk { LLVector3d hips_offset(0.0f, 0.0f, 1.2f); gAgent.teleportViaLocation(pos + hips_offset); @@ -2261,7 +2396,10 @@ class LLAvatarFreeze : public view_listener_t LLUUID* avatar_id = new LLUUID( avatar->getID() ); std::string fullname = avatar->getFullname(); - if (!fullname.empty()) + if (!fullname.empty() +//MK + && !(RRenabled && gAgent.mRRInterface.mContainsShownames)) +//mk { LLStringUtil::format_map_t args; args["[AVATAR_NAME]"] = fullname; @@ -2285,6 +2423,12 @@ class LLAvatarVisibleDebug : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + return false; + } +//mk bool new_value = gAgent.isGodlike(); gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); return true; @@ -2295,6 +2439,12 @@ class LLAvatarEnableDebug : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + return false; + } +//mk bool new_value = gAgent.isGodlike(); gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); return true; @@ -2305,6 +2455,12 @@ class LLAvatarDebug : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + return false; + } +//mk LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); if( avatar ) { @@ -2397,7 +2553,13 @@ class LLAvatarEject : public view_listener_t MenuCallbackData *data = new MenuCallbackData; (*data).avatar_id = avatar->getID(); std::string fullname = avatar->getFullname(); - +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + fullname = gAgent.mRRInterface.getDummyName (fullname); + } +//mk + const LLVector3d& pos = avatar->getPositionGlobal(); LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos)->getParcel(); @@ -2478,6 +2640,12 @@ class LLAvatarGiveCard : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + return false; + } +//mk llinfos << "handle_give_card()" << llendl; LLViewerObject* dest = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); if(dest && dest->isAvatar()) @@ -2727,6 +2895,12 @@ class LLSelfStandUp : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsUnsit) + { + return true; + } +//mk gAgent.setControlFlags(AGENT_CONTROL_STAND_UP); return true; } @@ -2909,6 +3083,12 @@ class LLAvatarEnableAddFriend : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + return false; + } +//mk LLVOAvatar* avatar = find_avatar_from_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject()); bool new_value = avatar && !is_agent_friend(avatar->getID()); gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); @@ -2935,7 +3115,7 @@ void request_friendship(const LLUUID& dest_id) } if (!fullname.empty()) { - LLPanelFriends::requestFriendshipDialog(dest_id, fullname); + LLFloaterFriends::requestFriendshipDialog(dest_id, fullname); } else { @@ -2969,6 +3149,17 @@ bool handle_sit_or_stand() return true; } +//MK + if (RRenabled && gAgent.mRRInterface.mContainsUnsit) + { + if (gAgent.getAvatarObject() && + gAgent.getAvatarObject()->mIsSitting) + { + return true; + } + } +//mk + if (sitting_on_selection()) { gAgent.setControlFlags(AGENT_CONTROL_STAND_UP); @@ -2979,6 +3170,22 @@ bool handle_sit_or_stand() if (object && object->getPCode() == LL_PCODE_VOLUME) { +//MK + if (RRenabled && gAgent.mRRInterface.contains ("sit")) + { + return true; + } + if (RRenabled && gAgent.mRRInterface.contains ("sittp") + || gAgent.mRRInterface.mContainsFartouch) + { + LLVector3 pos = object->getPositionRegion() + pick.mObjectOffset; + pos -= gAgent.getPositionAgent (); + if (pos.magVec () >= 1.5) + { + return true; + } + } +//mk gMessageSystem->newMessageFast(_PREHASH_AgentRequestSit); gMessageSystem->nextBlockFast(_PREHASH_AgentData); gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); @@ -3016,6 +3223,12 @@ class LLLandSit : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsUnsit) + { + return true; + } +//mk gAgent.setControlFlags(AGENT_CONTROL_STAND_UP); LLViewerParcelMgr::getInstance()->deselectLand(); @@ -3337,6 +3550,12 @@ class LLEditDuplicate : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsRez) + { + return true; + } +//mk if(LLEditMenuHandler::gEditMenuHandler) { LLEditMenuHandler::gEditMenuHandler->duplicate(); @@ -3350,6 +3569,12 @@ class LLEditEnableDuplicate : public view_listener_t bool handleEvent(LLPointer event, const LLSD& userdata) { bool new_value = LLEditMenuHandler::gEditMenuHandler && LLEditMenuHandler::gEditMenuHandler->canDuplicate(); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsRez) + { + new_value = false; + } +//mk gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); return true; } @@ -3750,6 +3975,19 @@ class LLObjectReturn : public view_listener_t bool handleEvent(LLPointer event, const LLSD& userdata) { if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return true; + +//MK + if (RRenabled && gAgent.mRRInterface.mContainsRez) + { + return false; + } + + if (RRenabled && gAgent.mRRInterface.mContainsUnsit + && gAgent.mRRInterface.isSittingOnAnySelectedObject()) + { + return false; + } +//mk mObjectSelection = LLSelectMgr::getInstance()->getEditSelection(); @@ -3787,6 +4025,18 @@ class LLObjectEnableReturn : public view_listener_t #ifdef HACKED_GODLIKE_VIEWER bool new_value = true; #else +//MK + if (RRenabled && gAgent.mRRInterface.mContainsRez) + { + return false; + } + + if (RRenabled && gAgent.mRRInterface.mContainsUnsit + && gAgent.mRRInterface.isSittingOnAnySelectedObject()) + { + return false; + } +//mk bool new_value = false; if (gAgent.isGodlike()) { @@ -3808,6 +4058,12 @@ class LLObjectEnableReturn : public view_listener_t { virtual bool apply(LLViewerObject* obj) { +//MK + if (RRenabled && obj->isSeat() && gAgent.mRRInterface.mContainsUnsit) + { + return false; + } +//mk return (obj->isOverAgentOwnedLand() || obj->isOverGroupOwnedLand() || obj->permModify()); @@ -3840,6 +4096,19 @@ void handle_take() return; } +//MK + if (RRenabled && gAgent.mRRInterface.mContainsRez) + { + return; + } + + if (RRenabled && gAgent.mRRInterface.mContainsUnsit + && gAgent.mRRInterface.isSittingOnAnySelectedObject()) + { + return; + } +//mk + BOOL you_own_everything = TRUE; BOOL locked_but_takeable_object = FALSE; LLUUID category_id; @@ -3960,7 +4229,12 @@ BOOL enable_take() { return FALSE; } - +//MK + if (RRenabled && gAgent.mRRInterface.mContainsRez) + { + return FALSE; + } +//mk for (LLObjectSelection::valid_root_iterator iter = LLSelectMgr::getInstance()->getSelection()->valid_root_begin(); iter != LLSelectMgr::getInstance()->getSelection()->valid_root_end(); iter++) { @@ -4374,6 +4648,13 @@ class LLToolsUnlink : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsUnsit + && gAgent.mRRInterface.isSittingOnAnySelectedObject()) + { + return true; + } +//mk LLSelectMgr::getInstance()->sendDelink(); return true; } @@ -4384,12 +4665,7 @@ class LLToolsStopAllAnimations : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - LLVOAvatar* avatarp = gAgent.getAvatarObject(); - if (avatarp) - { - avatarp->deactivateAllMotions(); - avatarp->startDefaultMotions(); - } + gAgent.stopCurrentAnimations(); return true; } }; @@ -4398,6 +4674,12 @@ class LLToolsReleaseKeys : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsDetach) + { + return false; + } +//mk gAgent.forceReleaseControls(); return true; @@ -4516,6 +4798,13 @@ class LLEditEnableDelete : public view_listener_t bool handleEvent(LLPointer event, const LLSD& userdata) { bool new_value = LLEditMenuHandler::gEditMenuHandler && LLEditMenuHandler::gEditMenuHandler->canDoDelete(); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsRez + && (LLEditMenuHandler::gEditMenuHandler == LLSelectMgr::getInstance())) // the Delete key must not be inhibited for text + { + new_value = false; + } +//mk gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); return true; } @@ -4556,6 +4845,12 @@ class LLObjectEnableDelete : public view_listener_t # endif LLSelectMgr::getInstance()->canDoDelete(); #endif +//MK + if (RRenabled && gAgent.mRRInterface.mContainsRez) + { + new_value = false; + } +//mk gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); return true; } @@ -4956,6 +5251,12 @@ class LLWorldCreateLandmark : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + return true; + } +//mk LLViewerRegion* agent_region = gAgent.getRegion(); if(!agent_region) { @@ -5056,6 +5357,12 @@ class LLAvatarInviteToGroup : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + return false; + } +//mk LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); if(avatar) { @@ -5069,6 +5376,12 @@ class LLAvatarAddFriend : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + return false; + } +//mk LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); if(avatar && !is_agent_friend(avatar->getID())) { @@ -5103,6 +5416,12 @@ void complete_give_money(S32 option, void* user_data) { if (objectp->isAvatar()) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + return; + } +//mk const BOOL is_group = FALSE; LLFloaterPay::payDirectly(&give_money, objectp->getID(), @@ -5283,7 +5602,7 @@ class LLShowFloater : public view_listener_t } else if (floater_name == "friends") { - LLFloaterMyFriends::toggleInstance(0); + LLFloaterFriends::toggle(NULL); } else if (floater_name == "preferences") { @@ -5303,7 +5622,7 @@ class LLShowFloater : public view_listener_t } else if (floater_name == "im") { - LLFloaterChatterBox::toggleInstance(LLSD()); + LLIMMgr::toggle(NULL); } else if (floater_name == "inventory") { @@ -5344,7 +5663,12 @@ class LLShowFloater : public view_listener_t LLViewerParcelMgr::getInstance()->selectParcelAt(gAgent.getPositionGlobal()); } - LLFloaterLand::showInstance(); +//MK + if (!RRenabled || !gAgent.mRRInterface.mContainsShowloc) + { +//mk + LLFloaterLand::showInstance(); + } } else if (floater_name == "buy land") { @@ -5353,11 +5677,21 @@ class LLShowFloater : public view_listener_t LLViewerParcelMgr::getInstance()->selectParcelAt(gAgent.getPositionGlobal()); } - LLViewerParcelMgr::getInstance()->startBuyLand(); +//MK + if (!RRenabled || !gAgent.mRRInterface.mContainsShowloc) + { +//mk + LLViewerParcelMgr::getInstance()->startBuyLand(); + } } else if (floater_name == "about region") { - LLFloaterRegionInfo::showInstance(); +//MK + if (!RRenabled || !gAgent.mRRInterface.mContainsShowloc) + { +//mk + LLFloaterRegionInfo::showInstance(); + } } else if (floater_name == "grid options") { @@ -5427,7 +5761,7 @@ class LLFloaterVisible : public view_listener_t bool new_value = false; if (floater_name == "friends") { - new_value = LLFloaterMyFriends::instanceVisible(0); + new_value = LLFloaterFriends::visible(NULL); } else if (floater_name == "communicate") { @@ -5447,7 +5781,7 @@ class LLFloaterVisible : public view_listener_t } else if (floater_name == "im") { - new_value = LLFloaterMyFriends::instanceVisible(0); + new_value = LLFloaterChatterBox::instanceVisible(0); } else if (floater_name == "mute list") { @@ -5525,6 +5859,12 @@ class LLShowAgentProfile : public view_listener_t } else if (userdata.asString() == "hit object") { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + return false; + } +//mk LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); if (objectp) { @@ -5549,7 +5889,19 @@ class LLShowAgentGroups : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - LLFloaterMyFriends::toggleInstance(1); + LLUUID agent_id; + if (userdata.asString() == "agent") + { + agent_id = gAgent.getID(); + } + else + { + agent_id = userdata.asUUID(); + } + if(agent_id.notNull()) + { + LLFloaterGroups::show(); + } return true; } }; @@ -5584,6 +5936,12 @@ class LLLandEdit : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsEdit) + { + return false; + } +//mk if (gAgent.getFocusOnAvatar() && gSavedSettings.getBOOL("EditCameraMovement") ) { // zoom in if we're looking at the avatar @@ -5661,6 +6019,12 @@ class LLObjectAttachToAvatar : public view_listener_t private: bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsRez) + { + return false; // we can't take objects when unable to rez + } +//mk setObjectSelection(LLSelectMgr::getInstance()->getSelection()); LLViewerObject* selectedObject = sObjectSelection->getFirstRootObject(); if (selectedObject) @@ -5669,6 +6033,22 @@ class LLObjectAttachToAvatar : public view_listener_t LLViewerJointAttachment* attachment_point = NULL; if (index > 0) attachment_point = get_if_there(gAgent.getAvatarObject()->mAttachmentPoints, index, (LLViewerJointAttachment*)NULL); +//MK + if (RRenabled) + { + if (index == 0 && gAgent.mRRInterface.mContainsDetach) + { + setObjectSelection (NULL); + return false; // something is locked and we're attempting a Wear in-world + } + if (attachment_point + && !gAgent.mRRInterface.canAttach(NULL, attachment_point->getName())) + { + setObjectSelection (NULL); + return false; + } + } +//mk confirm_replace_attachment(0, attachment_point); } return true; @@ -5794,6 +6174,12 @@ void handle_detach_from_avatar(void* user_data) if (attached_object) { +//MK + if (RRenabled && !gAgent.mRRInterface.canDetach(attached_object)) + { + return; + } +//mk gMessageSystem->newMessage("ObjectDetach"); gMessageSystem->nextBlockFast(_PREHASH_AgentData); gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); @@ -5853,6 +6239,13 @@ class LLAttachmentDetach : public view_listener_t return true; } +//MK + if (RRenabled && !gAgent.mRRInterface.canDetach(object)) + { + return true; + } +//mk + LLViewerObject *parent = (LLViewerObject*)object->getParent(); while (parent) { @@ -5961,6 +6354,12 @@ class LLAttachmentEnableDrop : public view_listener_t //now check to make sure that the item is actually in the inventory before we enable dropping it bool new_value = enable_detach(NULL) && can_build && item; +//MK + if (RRenabled && gAgent.mRRInterface.mContainsRez) + { + new_value = false; + } +//mk gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); return true; } @@ -5972,6 +6371,22 @@ BOOL enable_detach(void*) if (!object) return FALSE; if (!object->isAttachment()) return FALSE; +//MK + if (RRenabled) + { + if (!gAgent.mRRInterface.canDetach(object)) + { + return FALSE; + } + + // prevent a clever workaround that allowed to detach several objects at the same time by selecting them + if (gAgent.mRRInterface.mContainsDetach && LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() > 1) + { + return FALSE; + } + } +//mk + // Find the avatar who owns this attachment LLViewerObject* avatar = object; while (avatar) @@ -6057,6 +6472,12 @@ class LLObjectEnableWear : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsDetach) + { + return false; + } +//mk bool is_wearable = object_selected_and_point_valid(NULL); gMenuHolder->findControl(userdata["control"].asString())->setValue(is_wearable); return TRUE; @@ -6075,6 +6496,12 @@ class LLAvatarSendIM : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + return false; + } +//mk LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); if(avatar) { @@ -6212,6 +6639,13 @@ class LLToolsSelectedScriptAction : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + // If there is at least one object locked in the selection, don't allow anything + if (RRenabled && !gAgent.mRRInterface.canDetachAllSelectedObjects()) + { + return true; + } +//mk std::string action = userdata.asString(); if (action == "compile mono") { @@ -6299,12 +6733,28 @@ void handle_dump_image_list(void*) void handle_test_male(void*) { +//MK + if (RRenabled && (gAgent.mRRInterface.mContainsDetach || + gAgent.mRRInterface.contains ("remoutfit") || + gAgent.mRRInterface.contains ("addoutfit"))) + { + return; + } +//mk wear_outfit_by_name("Male Shape & Outfit"); //gGestureList.requestResetFromServer( TRUE ); } void handle_test_female(void*) { +//MK + if (RRenabled && (gAgent.mRRInterface.mContainsDetach || + gAgent.mRRInterface.contains ("remoutfit") || + gAgent.mRRInterface.contains ("addoutfit"))) + { + return; + } +//mk wear_outfit_by_name("Female Shape & Outfit"); //gGestureList.requestResetFromServer( FALSE ); } @@ -6327,6 +6777,13 @@ void handle_dump_attachments(void*) return; } +//MK + if (RRenabled && gAgent.mRRInterface.mContainsDetach) + { + return; + } +//mk + for (LLVOAvatar::attachment_map_t::iterator iter = avatar->mAttachmentPoints.begin(); iter != avatar->mAttachmentPoints.end(); ) { @@ -6503,6 +6960,12 @@ class LLToolsEnableTakeCopy : public view_listener_t { virtual bool apply(LLViewerObject* obj) { +//MK + if (RRenabled && obj->isSeat () && gAgent.mRRInterface.mContainsUnsit) + { + return true; + } +//mk return (!obj->permCopy() || obj->isAttachment()); } } func; @@ -6704,6 +7167,12 @@ class LLWorldEnableCreateLandmark : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + return false; + } +//mk bool new_value = gAgent.isGodlike() || (gAgent.getRegion() && gAgent.getRegion()->getAllowLandmark()); gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); @@ -6936,6 +7405,9 @@ void handle_grab_texture(void* data) case LLVOAvatar::TEX_EYES_BAKED: name.append("Iris"); break; + case LLVOAvatar::TEX_HAIR_BAKED: + name.append("Hair"); + break; case LLVOAvatar::TEX_HEAD_BAKED: name.append("Head"); break; @@ -7251,6 +7723,12 @@ class LLViewHighlightTransparent : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsEdit) + { + return true; + } +//mk LLDrawPoolAlpha::sShowDebugAlpha = !LLDrawPoolAlpha::sShowDebugAlpha; return true; } @@ -7261,6 +7739,12 @@ class LLViewCheckHighlightTransparent : public view_listener_t bool handleEvent(LLPointer event, const LLSD& userdata) { bool new_value = LLDrawPoolAlpha::sShowDebugAlpha; +//MK + if (RRenabled && gAgent.mRRInterface.mContainsEdit) + { + new_value = false; + } +//mk gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); return true; } @@ -7298,6 +7782,12 @@ class LLViewShowHUDAttachments : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mHasLockedHuds) + { + return true; + } +//mk LLPipeline::sShowHUDAttachments = !LLPipeline::sShowHUDAttachments; return true; } @@ -7307,6 +7797,12 @@ class LLViewCheckHUDAttachments : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mHasLockedHuds) + { + return false; + } +//mk bool new_value = LLPipeline::sShowHUDAttachments; gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); return true; @@ -7320,6 +7816,14 @@ class LLEditEnableTakeOff : public view_listener_t std::string control_name = userdata["control"].asString(); std::string clothing = userdata["data"].asString(); bool new_value = false; +//MK + if (RRenabled && ( + gAgent.mRRInterface.contains ("remoutfit") + || gAgent.mRRInterface.contains ("remoutfit:" + clothing) ) ) + { + return false; + } +//mk if (clothing == "shirt") { new_value = LLAgent::selfHasWearable((void *)WT_SHIRT); @@ -7356,6 +7860,14 @@ class LLEditEnableTakeOff : public view_listener_t { new_value = LLAgent::selfHasWearable((void *)WT_SKIRT); } + if (clothing == "alpha") + { + new_value = LLAgent::selfHasWearable((void *)WT_ALPHA); + } + if (clothing == "tattoo") + { + new_value = LLAgent::selfHasWearable((void *)WT_TATTOO); + } gMenuHolder->findControl(control_name)->setValue(new_value); return true; } @@ -7402,6 +7914,14 @@ class LLEditTakeOff : public view_listener_t { LLAgent::userRemoveWearable((void*)WT_SKIRT); } + else if (clothing == "alpha") + { + LLAgent::userRemoveWearable((void*)WT_ALPHA); + } + else if (clothing == "tattoo") + { + LLAgent::userRemoveWearable((void*)WT_TATTOO); + } else if (clothing == "all") { LLAgent::userRemoveAllClothes(NULL); @@ -7423,6 +7943,12 @@ class LLToolsSelectTool : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsEdit) + { + return true; + } +//mk std::string tool_name = userdata.asString(); if (tool_name == "focus") { @@ -7453,6 +7979,12 @@ class LLWorldEnvSettings : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsSetenv) + { + return true; + } +//mk std::string tod = userdata.asString(); LLVector3 sun_direction; @@ -7530,6 +8062,12 @@ class LLWorldWaterSettings : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsSetenv) + { + return true; + } +//mk // if not there or is hidden, show it if( !LLFloaterWater::isOpen() || !LLFloaterWater::instance()->getVisible()) { @@ -7550,6 +8088,12 @@ class LLWorldPostProcess : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsSetenv) + { + return true; + } +//mk LLFloaterPostProcess::show(); return true; } @@ -7560,6 +8104,12 @@ class LLWorldDayCycle : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { +//MK + if (RRenabled && gAgent.mRRInterface.mContainsSetenv) + { + return true; + } +//mk LLFloaterDayCycle::show(); return true; } @@ -7607,7 +8157,6 @@ void initialize_menus() addMenu(new LLViewMouselook(), "View.Mouselook"); addMenu(new LLViewBuildMode(), "View.BuildMode"); addMenu(new LLViewJoystickFlycam(), "View.JoystickFlycam"); - addMenu(new LLViewCommunicate(), "View.Communicate"); addMenu(new LLViewResetView(), "View.ResetView"); addMenu(new LLViewLookAtLastChatter(), "View.LookAtLastChatter"); addMenu(new LLViewShowHoverTips(), "View.ShowHoverTips"); diff --git a/linden/indra/newview/llviewermenufile.cpp b/linden/indra/newview/llviewermenufile.cpp index c998ba6..ad1f33a 100644 --- a/linden/indra/newview/llviewermenufile.cpp +++ b/linden/indra/newview/llviewermenufile.cpp @@ -821,6 +821,40 @@ void upload_new_resource(const std::string& src_filename, std::string name, } } +void temp_upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExtStat ext_status) // StoreAssetData callback (fixed) +{ + LLResourceData* data = (LLResourceData*)user_data; + if(result >= 0) + { + LLAssetType::EType dest_loc = (data->mPreferredLocation == LLAssetType::AT_NONE) ? data->mAssetInfo.mType : data->mPreferredLocation; + LLUUID folder_id(gInventory.findCategoryUUIDForType(dest_loc)); + LLUUID item_id; + item_id.generate(); + LLPermissions perm; + perm.init(gAgentID, + gAgentID, + gAgentID, + gAgentID); + perm.setMaskBase(PERM_ALL); + perm.setMaskOwner(PERM_ALL); + perm.setMaskEveryone(PERM_ALL); + perm.setMaskGroup(PERM_ALL); + LLPointer item = new LLViewerInventoryItem(item_id, folder_id, perm, data->mAssetInfo.mTransactionID.makeAssetID(gAgent.getSecureSessionID()), data->mAssetInfo.mType, data->mInventoryType, data->mAssetInfo.getName(), "", LLSaleInfo::DEFAULT, LLInventoryItem::II_FLAGS_NONE, time_corrected()); + item->updateServer(TRUE); + gInventory.updateItem(item); + gInventory.notifyObservers(); + }else // if(result >= 0) + { + LLStringUtil::format_map_t args; + args["[FILE]"] = LLInventoryType::lookupHumanReadable(data->mInventoryType); + args["[REASON]"] = std::string(LLAssetStorage::getErrorString(result)); + gViewerWindow->alertXml("CannotUploadReason", args); + } + + LLUploadDialog::modalUploadFinished(); + delete data; +} + void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExtStat ext_status) // StoreAssetData callback (fixed) { LLResourceData* data = (LLResourceData*)user_data; @@ -981,7 +1015,9 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty lldebugs << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLAssetType::AT_NONE) ? asset_type : destination_folder_type) << llendl; lldebugs << "Asset Type: " << LLAssetType::lookup(asset_type) << llendl; std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory"); - if (!url.empty()) + BOOL temporary_up = gSavedSettings.getBOOL("EmeraldTemporaryUpload"); + gSavedSettings.setBOOL("EmeraldTemporaryUpload",FALSE); + if (!url.empty() && temporary_up == FALSE) { llinfos << "New Agent Inventory via capability" << llendl; LLSD body; @@ -998,20 +1034,23 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty } else { - llinfos << "NewAgentInventory capability not found, new agent inventory via asset system." << llendl; - // check for adequate funds - // TODO: do this check on the sim - if (LLAssetType::AT_SOUND == asset_type || - LLAssetType::AT_TEXTURE == asset_type || - LLAssetType::AT_ANIMATION == asset_type) + if(temporary_up == FALSE) { - S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); - S32 balance = gStatusBar->getBalance(); - if (balance < upload_cost) + llinfos << "NewAgentInventory capability not found, new agent inventory via asset system." << llendl; + // check for adequate funds + // TODO: do this check on the sim + if (LLAssetType::AT_SOUND == asset_type || + LLAssetType::AT_TEXTURE == asset_type || + LLAssetType::AT_ANIMATION == asset_type) { - // insufficient funds, bail on this upload - LLFloaterBuyCurrency::buyCurrency("Uploading costs", upload_cost); - return; + S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); + S32 balance = gStatusBar->getBalance(); + if (balance < upload_cost) + { + // insufficient funds, bail on this upload + LLFloaterBuyCurrency::buyCurrency("Uploading costs", upload_cost); + return; + } } } @@ -1027,7 +1066,7 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty data->mAssetInfo.setDescription(desc); data->mPreferredLocation = destination_folder_type; - LLAssetStorage::LLStoreAssetCallback asset_callback = &upload_done_callback; + LLAssetStorage::LLStoreAssetCallback asset_callback = temporary_up ? &temp_upload_done_callback : &upload_done_callback; if (callback) { asset_callback = callback; @@ -1035,7 +1074,9 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty gAssetStorage->storeAssetData(data->mAssetInfo.mTransactionID, data->mAssetInfo.mType, asset_callback, (void*)data, - FALSE); + temporary_up, + TRUE, + temporary_up); } } diff --git a/linden/indra/newview/llviewermessage.cpp b/linden/indra/newview/llviewermessage.cpp index 4dc7b5a..dccb4e7 100644 --- a/linden/indra/newview/llviewermessage.cpp +++ b/linden/indra/newview/llviewermessage.cpp @@ -142,6 +142,10 @@ #include "llwindebug.h" // For the invalid message handler #endif +//MK +extern BOOL RRenabled; +//mk + // // Constants // @@ -1026,6 +1030,24 @@ void inventory_offer_callback(S32 button, void* user_data) bool busy=FALSE; +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + from_string = chatHistory_string = gAgent.mRRInterface.getDummyName(from_string); + } + + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + std::string str (info->mDesc.c_str()); + + // hide every occurrence of the Parcel name if the location restriction is active + str = gAgent.mRRInterface.stringReplace (str, gAgent.mRRInterface.getParcelName(), "(Parcel hidden)"); + // hide every occurrence of the Region name if the location restriction is active + str = gAgent.mRRInterface.stringReplace (str, gAgent.getRegion()->getName(), "(Region hidden)"); + info->mDesc = str; + } +//mk + switch(button) { case IOR_ACCEPT: @@ -1397,6 +1419,21 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) // These are used for system messages, hence don't need the name, // as it is always "Second Life". // *TODO:translate +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + // hide every occurrence of the Parcel name if the location restriction is active + message = gAgent.mRRInterface.stringReplace (message, gAgent.mRRInterface.getParcelName(), "(Parcel hidden)"); + // hide every occurrence of the Region name if the location restriction is active + message = gAgent.mRRInterface.stringReplace (message, gAgent.getRegion()->getName(), "(Region hidden)"); + } + + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + // censor object IMs but not avatar IMs + message = gAgent.mRRInterface.getCensoredMessage (message); + } +//mk args["[MESSAGE]"] = message; // Note: don't put the message in the IM history, even though was sent @@ -1413,11 +1450,18 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) // do nothing -- don't distract newbies in // Prelude with global IMs } - else if (offline == IM_ONLINE && !is_linden && is_busy && name != SYSTEM_FROM) + else if (offline == IM_ONLINE && !is_linden && is_busy && name != SYSTEM_FROM +//MK + // agent is not forbidden to receive IMs or the sender is an exception => send Busy response + && (!RRenabled || (!gAgent.mRRInterface.containsWithoutException ("recvim", from_id.asString())))) +//mk { // return a standard "busy" message, but only do it to online IM // (i.e. not other auto responses and not store-and-forward IM) - if (!gIMMgr->hasSession(session_id)) + if (!gIMMgr->hasSession(session_id) +//MK + || RRenabled) +//mk { // if there is not a panel for this conversation (i.e. it is a new IM conversation // initiated by the other party) then... @@ -1461,11 +1505,74 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) chat.mText = std::string("IM: ") + name + separator_string + message.substr(message_offset); LLFloaterChat::addChat( chat, TRUE, TRUE ); } +//MK + else if (RRenabled && message == "@version") + { + // return the version message + std::string my_name; + gAgent.buildFullname(my_name); + std::string response = gAgent.mRRInterface.getVersion2 (); + pack_instant_message( + gMessageSystem, + gAgent.getID(), + FALSE, + gAgent.getSessionID(), + from_id, + my_name.c_str(), + response.c_str(), + IM_ONLINE, + IM_BUSY_AUTO_RESPONSE, + session_id); + gAgent.sendReliableMessage(); + + // remove the "XXX is typing..." label from the IM window + LLPointer im_info = new LLIMInfo(gMessageSystem); + gIMMgr->processIMTypingStop(im_info); + + //// now store incoming IM in chat history + + //snprintf(buffer, sizeof(buffer), "%s%s%s", name, separator_string, (message+message_offset)); /* Flawfinder: ignore */ + + //llinfos << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << llendl; + + //// add to IM panel, but do not bother the user + //gIMMgr->addMessage( + // session_id, + // from_id, + // name, + // buffer, + // NULL, + // dialog, + // parent_estate_id, + // region_id, + // position); + + //// pretend this is chat generated by self, so it does not show up on screen + //snprintf(buffer, sizeof(buffer), "IM: %s%s%s", name, separator_string, (message+message_offset)); /* Flawfinder: ignore */ + //chat.mText = buffer; + //LLFloaterChat::addChat( chat, TRUE, TRUE ); + } +//mk else if (from_id.isNull()) { // Messages from "Second Life" ID don't go to IM history // messages which should be routed to IM window come from a user ID with name=SYSTEM_NAME chat.mText = name + ": " + message; +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + // hide every occurrence of the Parcel name if the location restriction is active + chat.mText = gAgent.mRRInterface.stringReplace (chat.mText, gAgent.mRRInterface.getParcelName(), "(Parcel hidden)"); + // hide every occurrence of the Region name if the location restriction is active + chat.mText = gAgent.mRRInterface.stringReplace (chat.mText, gAgent.getRegion()->getName(), "(Region hidden)"); + } + + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + // censor that message + chat.mText = gAgent.mRRInterface.getCensoredMessage(chat.mText); + } +//mk LLFloaterChat::addChat(chat, FALSE, FALSE); } else if (to_id.isNull()) @@ -1492,6 +1599,32 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) } buffer = separator_string + saved + message.substr(message_offset); +//MK + if (RRenabled && gAgent.mRRInterface.containsWithoutException ("recvim", from_id.asString())) + { + // agent is forbidden to receive IMs and the sender is no exception + buffer = separator_string + saved + "*** IM blocked by your viewer"; + + // tell the sender the avatar could not read them + std::string my_name; + gAgent.buildFullname(my_name); + my_name = my_name+" using viewer "+gAgent.mRRInterface.getVersion2 (); + std::string response = "The Resident you messaged is prevented from reading your instant messages at the moment, please try again later."; + pack_instant_message( + gMessageSystem, + gAgent.getID(), + FALSE, + gAgent.getSessionID(), + from_id, + my_name.c_str(), + response.c_str(), + IM_ONLINE, + IM_BUSY_AUTO_RESPONSE, + session_id); + gAgent.sendReliableMessage(); + } +//mk + LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL; if (!is_muted || is_linden) @@ -1507,7 +1640,14 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) region_id, position, true); - chat.mText = std::string("IM: ") + name + separator_string + saved + message.substr(message_offset); +//MK + // RR disabled, or agent is not forbidden to receive IMs, + // or the sender is an exception => duplicate in chat box + if (!RRenabled || !gAgent.mRRInterface.containsWithoutException ("recvim", from_id.asString())) + { +//mk + chat.mText = std::string("IM: ") + name + separator_string + saved + message.substr(message_offset); + } BOOL local_agent = gSavedSettings.getBOOL("HideIMInChat"); LLFloaterChat::addChat( chat, TRUE, local_agent ); @@ -1542,6 +1682,20 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) { // This is a block, modeless dialog. //*TODO:translate +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + // hide every occurrence of the Parcel name if the location restriction is active + message = gAgent.mRRInterface.stringReplace (message, gAgent.mRRInterface.getParcelName(), "(Parcel hidden)"); + // hide every occurrence of the Region name if the location restriction is active + message = gAgent.mRRInterface.stringReplace (message, gAgent.getRegion()->getName(), "(Region hidden)"); + } + + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + message = gAgent.mRRInterface.getCensoredMessage(message); + } +//mk args["[MESSAGE]"] = message; LLNotifyBox::showXml("SystemMessage", args); } @@ -1706,8 +1860,23 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) info->mFromID = from_id; info->mFromGroup = from_group; info->mTransactionID = session_id; - info->mFolderID = gInventory.findCategoryUUIDForType(info->mType); - +//MK + std::string folder_name(message); + if (RRenabled && !gSavedSettings.getBOOL("RestrainedLoveForbidGiveToRLV") && + info->mType == LLAssetType::AT_CATEGORY && + gAgent.mRRInterface.getRlvShare() && + folder_name.find(RR_RLV_REDIR_FOLDER_PREFIX) == 1) + { + info->mFolderID = gAgent.mRRInterface.getRlvShare()->getUUID(); + } + else + { +//mk + info->mFolderID = gInventory.findCategoryUUIDForType(info->mType); +//MK + } +//mk + if (dialog == IM_TASK_INVENTORY_OFFERED) { info->mFromObject = TRUE; @@ -1717,6 +1886,15 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) info->mFromObject = FALSE; } info->mFromName = name; +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + // hide every occurrence of the Parcel name if the location restriction is active + message = gAgent.mRRInterface.stringReplace (message, gAgent.mRRInterface.getParcelName(), "(Parcel hidden)"); + // hide every occurrence of the Region name if the location restriction is active + message = gAgent.mRRInterface.stringReplace (message, gAgent.getRegion()->getName(), "(Region hidden)"); + } +//mk info->mDesc = message; info->mHost = msg->getSender(); //if (((is_busy && !is_owned_by_me) || is_muted)) @@ -1766,7 +1944,13 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) { return; } - +//MK + if (RRenabled && gAgent.mRRInterface.containsWithoutException ("recvim")) + { + // agent is forbidden to receive IMs + return; + } +//mk // Only show messages if we have a session open (which // should happen after you get an "invitation" if ( !gIMMgr->hasSession(session_id) ) @@ -1808,6 +1992,20 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) { return; } +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + // hide every occurrence of the Parcel name if the location restriction is active + message = gAgent.mRRInterface.stringReplace (message, gAgent.mRRInterface.getParcelName(), "(Parcel hidden)"); + // hide every occurrence of the Region name if the location restriction is active + message = gAgent.mRRInterface.stringReplace (message, gAgent.getRegion()->getName(), "(Region hidden)"); + } + + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + message = gAgent.mRRInterface.getCensoredMessage(message); + } +//mk chat.mText = name + separator_string + message.substr(message_offset); // Note: lie to LLFloaterChat::addChat(), pretending that this is NOT an IM, because // IMs from objcts don't open IM sessions. @@ -1821,6 +2019,21 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) } { // Construct a viewer alert for this message. +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + // hide every occurrence of the Parcel name if the location restriction is active + message = gAgent.mRRInterface.stringReplace (message, gAgent.mRRInterface.getParcelName(), "(Parcel hidden)"); + // hide every occurrence of the Region name if the location restriction is active + message = gAgent.mRRInterface.stringReplace (message, gAgent.getRegion()->getName(), "(Region hidden)"); + } + + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + // censor object IMs but not avatar IMs + message = gAgent.mRRInterface.getCensoredMessage (message); + } +//mk args["[NAME]"] = name; args["[MESSAGE]"] = message; LLNotifyBox::showXml("ObjectMessage", args); @@ -1852,12 +2065,58 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) } else { - // *TODO:translate -> [FIRST] [LAST] (maybe) - LLLureInfo* info = new LLLureInfo(from_id, session_id, FALSE); - args["[NAME]"] = name; - args["[MESSAGE]"] = message; - LLNotifyBox::showXml("OfferTeleport", args, - lure_callback, (void*)info); +//MK + LLVOAvatar* avatar = gAgent.getAvatarObject(); + if (RRenabled + && (gAgent.mRRInterface.containsWithoutException ("tplure", from_id.asString()) + || (gAgent.mRRInterface.mContainsUnsit && avatar && avatar->mIsSitting))) + { + std::string response = "The Resident you invited is prevented from accepting teleport offers. Please try again later."; + pack_instant_message( + gMessageSystem, + gAgent.getID(), + FALSE, + gAgent.getSessionID(), + from_id, + SYSTEM_FROM, + response.c_str(), + IM_ONLINE, + IM_CONSOLE_AND_CHAT_HISTORY); + gAgent.sendReliableMessage(); + return; + } + + if (RRenabled && gAgent.mRRInterface.containsWithoutException ("recvim", from_id.asString())) + { + message = "(Hidden)"; + } + + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) { + message = "(Hidden)"; + } + + if (RRenabled && (gAgent.mRRInterface.contains ("accepttp:"+from_id.asString()) + || gAgent.mRRInterface.contains ("accepttp"))) + { + // accepttp => the viewer acts like it was teleported by a god + gAgent.mRRInterface.setAllowCancelTp (FALSE); + LLLureInfo* info = new LLLureInfo(from_id, session_id, TRUE); + // do not show a message box, because you're about to be + // teleported. + lure_callback(0, (void *)info); + } + else + { +//mk + // *TODO:translate -> [FIRST] [LAST] (maybe) + LLLureInfo* info = new LLLureInfo(from_id, session_id, FALSE); + args["[NAME]"] = name; + args["[MESSAGE]"] = message; + LLNotifyBox::showXml("OfferTeleport", args, + lure_callback, (void*)info); +//MK + } +//mk } } break; @@ -1919,6 +2178,12 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) else { args["[NAME]"] = name; +//MK + if (RRenabled && gAgent.mRRInterface.containsWithoutException ("recvim", from_id.asString())) + { + message = "(Hidden)"; + } +//mk if(message.empty()) { //support for frienship offers from clients before July 2008 @@ -1928,6 +2193,12 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) else { args["[MESSAGE]"] = message; +//MK + if (RRenabled && gAgent.mRRInterface.containsWithoutException ("recvim", from_id.asString())) + { + message = "(Hidden)"; + } +//mk LLNotifyBox::showXml("OfferFriendship", args, &friendship_offer_callback, (void*)offer); } @@ -2162,6 +2433,9 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) LLUUID owner_id; BOOL is_owned_by_me = FALSE; LLViewerObject* chatter; +//MK + BOOL twirly = FALSE; +//mk msg->getString("ChatData", "FromName", from_name); chat.mFromName = from_name; @@ -2205,13 +2479,16 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) if (chat.mSourceType == CHAT_SOURCE_OBJECT && chat.mChatType != CHAT_TYPE_DEBUG_MSG) { - LLPointer psc = new LLViewerPartSourceChat(chatter->getPositionAgent()); - psc->setSourceObject(chatter); - psc->setColor(color); - //We set the particles to be owned by the object's owner, - //just in case they should be muted by the mute list - psc->setOwnerUUID(owner_id); - LLViewerPartSim::getInstance()->addPartSource(psc); +//MK +//// LLPointer psc = new LLViewerPartSourceChat(chatter->getPositionAgent()); +//// psc->setSourceObject(chatter); +//// psc->setColor(color); +//// //We set the particles to be owned by the object's owner, +//// //just in case they should be muted by the mute list +//// psc->setOwnerUUID(owner_id); +//// LLViewerPartSim::getInstance()->addPartSource(psc); + twirly = TRUE; +//mk } // record last audible utterance @@ -2237,7 +2514,46 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) msg->getStringFast(_PREHASH_ChatData, _PREHASH_Message, mesg); BOOL ircstyle = FALSE; +//MK + if (RRenabled && chat.mChatType != CHAT_TYPE_OWNER) + { + if ((chatter && (chatter->isAvatar () || !chatter->isAttachment () || !chatter->permYouOwner ())) // avatar, object or attachment that doesn't belong to me + || !chatter) /// or this may be a HUD (visible only to the other party) or an unrezzed avatar or object + { + if (gAgent.mRRInterface.containsWithoutException ("recvchat", from_id.asString())) + { + chat.mFromName = from_name; + chat.mText = gAgent.mRRInterface.crunchEmote (mesg, 20); // + '\0'; + mesg = chat.mText; + } + if (gAgent.mRRInterface.containsWithoutException ("recvemote", from_id.asString())) + { + std::string prefix = mesg.substr(0, 4); + if (prefix == "/me " || prefix == "/me'") + { + chat.mFromName = from_name; + chat.mText = "/me ..."; + mesg = chat.mText; + } + } + + if (from_id != gAgent.getID() && gAgent.mRRInterface.mContainsShownames) + { + // also scramble the name of the chatter (replace with a dummy name) + if (chatter->isAvatar ()) + { + from_name = gAgent.mRRInterface.getDummyName (from_name, chat.mAudible); + } + else + { + from_name = gAgent.mRRInterface.getCensoredMessage (from_name); + } + chat.mFromName = from_name; + } + } + } +//mk // Look for IRC-style emotes here so chatbubbles work std::string prefix = mesg.substr(0, 4); if (prefix == "/me " || prefix == "/me'") @@ -2300,8 +2616,57 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) case CHAT_TYPE_WHISPER: verb = " " + LLTrans::getString("whisper") + " "; break; - case CHAT_TYPE_DEBUG_MSG: case CHAT_TYPE_OWNER: +//MK + // This is the actual handling of the commands sent by owned objects. + { + std::string mesg_str(mesg); + if (RRenabled && mesg_str.substr (0, 1) == RR_PREFIX) + { + std::string command = mesg_str.substr(1, mesg_str.length()); + LLStringUtil::toLower(command); + if (gAgent.mRRInterface.handleCommand (from_id, command)) + { + if (!gSavedSettings.getBOOL("RestrainedLoveDebug")) + { + return; + } + verb = " executes command: "; + } + else + { + verb = " fails command: "; + } + } +// else if (RRenabled && mesg_str.length() >= 2 && mesg_str.substr (0, 2) == "\t") // this is a remark, only visible to non-RLV users +// { +// return; +// } + else + { + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + // hide every occurrence of the Parcel name if the location restriction is active + mesg = gAgent.mRRInterface.stringReplace (mesg, + gAgent.mRRInterface.getParcelName(), "(Parcel hidden)"); + // hide every occurrence of the Region name if the location restriction is active + mesg = gAgent.mRRInterface.stringReplace (mesg, + gAgent.getRegion()->getName(), "(Region hidden)"); + } + + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + mesg = gAgent.mRRInterface.getCensoredMessage (mesg); + from_name = gAgent.mRRInterface.getCensoredMessage (from_name); + chat.mFromName = from_name; + } + + verb = ": "; + } + break; + } +//mk + case CHAT_TYPE_DEBUG_MSG: case CHAT_TYPE_NORMAL: verb = ": "; break; @@ -2317,13 +2682,29 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) verb = " say, "; break; } - - +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames && (!chatter || (chatter && !chatter->isAvatar()))) + { + // censor object chat but not avatar chat + mesg = gAgent.mRRInterface.getCensoredMessage (mesg); + } +//mk chat.mText = from_name; chat.mText += verb; chat.mText += mesg; } - +//MK + if (twirly) + { + LLPointer psc = new LLViewerPartSourceChat(chatter->getPositionAgent()); + psc->setSourceObject(chatter); + psc->setColor(color); + //We set the particles to be owned by the object's owner, + //just in case they should be muted by the mute list + psc->setOwnerUUID(owner_id); + LLViewerPartSim::getInstance()->addPartSource(psc); + } +//mk if (chatter) { chat.mPosAgent = chatter->getPositionAgent(); @@ -2379,6 +2760,13 @@ void process_teleport_start(LLMessageSystem *msg, void**) gViewerWindow->setProgressCancelButtonVisible(TRUE, std::string("Cancel")); // *TODO: Translate } +//MK + if (RRenabled && !gAgent.mRRInterface.getAllowCancelTp()) + { + gViewerWindow->setProgressCancelButtonVisible(FALSE, ""); + } +//mk + // Freeze the UI and show progress bar // Note: could add data here to differentiate between normal teleport and death. @@ -2405,7 +2793,10 @@ void process_teleport_progress(LLMessageSystem* msg, void**) } U32 teleport_flags = 0x0; msg->getU32("Info", "TeleportFlags", teleport_flags); - if (teleport_flags & TELEPORT_FLAGS_DISABLE_CANCEL) + if (teleport_flags & TELEPORT_FLAGS_DISABLE_CANCEL +//MK + || (RRenabled && !gAgent.mRRInterface.getAllowCancelTp())) +//mk { gViewerWindow->setProgressCancelButtonVisible(FALSE); } @@ -2539,6 +2930,14 @@ BOOL LLPostTeleportNotifiers::tick() // We're going to pretend to be a new agent void process_teleport_finish(LLMessageSystem* msg, void**) { +//MK + if (RRenabled && !gAgent.mRRInterface.getAllowCancelTp()) + { + // Cancel button was forcibly hidden by the RLV code ("@tpto") => allow it to show again + // for next time + gAgent.mRRInterface.setAllowCancelTp (TRUE); + } +//mk LL_DEBUGS("Messaging") << "Got teleport location message" << LL_ENDL; LLUUID agent_id; msg->getUUIDFast(_PREHASH_Info, _PREHASH_AgentID, agent_id); @@ -2745,9 +3144,14 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**) if (avatarp) { // Chat the "back" SLURL. (DEV-4907) - LLChat chat("Teleport completed from " + gAgent.getTeleportSourceSLURL()); - chat.mSourceType = CHAT_SOURCE_SYSTEM; - LLFloaterChat::addChatHistory(chat); +//MK + if (!RRenabled || !gAgent.mRRInterface.mContainsShowloc) + { +//mk + LLChat chat("Teleport completed from " + gAgent.getTeleportSourceSLURL()); + chat.mSourceType = CHAT_SOURCE_SYSTEM; + LLFloaterChat::addChatHistory(chat); + } // Set the new position avatarp->setPositionAgent(agent_pos); @@ -4305,6 +4709,14 @@ void notify_cautioned_script_question(LLScriptQuestionCBData* cbdata, S32 orig_q notice.setArg("[OBJECTNAME]", cbdata->mObjectName); notice.setArg("[OWNERNAME]", cbdata->mOwnerName); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + notice.setArg("[OBJECTNAME]", gAgent.mRRInterface.getCensoredMessage (cbdata->mObjectName)); + notice.setArg("[OWNERNAME]", gAgent.mRRInterface.getDummyName (cbdata->mOwnerName)); + } +//mk + // try to lookup viewerobject that corresponds to the object that // requested permissions (here, taskid->requesting object id) BOOL foundpos = FALSE; @@ -4319,7 +4731,14 @@ void notify_cautioned_script_question(LLScriptQuestionCBData* cbdata, S32 orig_q if (viewregion) { // got the region, so include the region and 3d coordinates of the object - notice.setArg("[REGIONNAME]", viewregion->getName()); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + notice.setArg("[REGIONNAME]", "(Region hidden)"); + } + else +//mk + notice.setArg("[REGIONNAME]", viewregion->getName()); std::string formatpos = llformat("%.1f, %.1f,%.1f", objpos[VX], objpos[VY], objpos[VZ]); notice.setArg("[REGIONPOS]", formatpos); @@ -4479,26 +4898,52 @@ void process_script_question(LLMessageSystem *msg, void **user_data) // don't display permission requests if this object is muted - JS. if (LLMuteList::getInstance()->isMuted(taskid)) return; +//MK + BOOL auto_acceptable_permission = FALSE; + if (RRenabled && gAgent.mRRInterface.contains ("acceptpermission")) + { + auto_acceptable_permission = (questions & + (LSCRIPTRunTimePermissionBits[1] | //LSCRIPTRunTimePermissions::SCRIPT_PERMISSION_TAKE_CONTROLS] + LSCRIPTRunTimePermissionBits[3] | //LSCRIPTRunTimePermissions::SCRIPT_PERMISSION_TRIGGER_ANIMATION] + LSCRIPTRunTimePermissionBits[4])); //LSCRIPTRunTimePermissions::SCRIPT_PERMISSION_ATTACH] + + // security check : if there is any other permission contained in this package, we can't automatically grant anything + if (auto_acceptable_permission) + { + unsigned int other_perms = questions & ~ (LSCRIPTRunTimePermissionBits[1] | LSCRIPTRunTimePermissionBits[3] | LSCRIPTRunTimePermissionBits[4]); + if (other_perms) auto_acceptable_permission = FALSE; + // can't accept animation permission if not sitting + if (gAgent.getAvatarObject() && !gAgent.getAvatarObject()->mIsSitting && (questions & LSCRIPTRunTimePermissionBits[3])) auto_acceptable_permission = FALSE; + } + } +//mk + // throttle excessive requests from any specific user's scripts typedef LLKeyThrottle LLStringThrottle; static LLStringThrottle question_throttle( LLREQUEST_PERMISSION_THROTTLE_LIMIT, LLREQUEST_PERMISSION_THROTTLE_INTERVAL ); - - switch (question_throttle.noteAction(owner_name)) - { - case LLStringThrottle::THROTTLE_NEWLY_BLOCKED: - LL_INFOS("Messaging") << "process_script_question throttled" - << " owner_name:" << owner_name - << LL_ENDL; - // Fall through - - case LLStringThrottle::THROTTLE_BLOCKED: - // Escape altogether until we recover - return; - - case LLStringThrottle::THROTTLE_OK: - break; +//MK + // do not throttle automatically accepted permissions + if (!auto_acceptable_permission) + { +//mk + switch (question_throttle.noteAction(owner_name)) + { + case LLStringThrottle::THROTTLE_NEWLY_BLOCKED: + LL_INFOS("Messaging") << "process_script_question throttled" + << " owner_name:" << owner_name + << LL_ENDL; + // Fall through + + case LLStringThrottle::THROTTLE_BLOCKED: + // Escape altogether until we recover + return; + + case LLStringThrottle::THROTTLE_OK: + break; + } +//MK } - +//mk std::string script_question; if (questions) { @@ -4523,7 +4968,14 @@ void process_script_question(LLMessageSystem *msg, void **user_data) args["[QUESTIONS]"] = script_question; LLScriptQuestionCBData *cbdata = new LLScriptQuestionCBData(taskid, itemid, sender, questions, object_name, owner_name); - +//MK + if (auto_acceptable_permission && !(caution && gSavedSettings.getBOOL("PermissionsCautionEnabled"))) + { + // reply with the permissions granted + script_question_cb (0 /* YES */, cbdata); + return; + } +//mk // check whether cautions are even enabled or not if (gSavedSettings.getBOOL("PermissionsCautionEnabled")) { @@ -4826,7 +5278,14 @@ void handle_lure_callback(S32 option, const std::string& text, void* userdata) msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); msg->nextBlockFast(_PREHASH_Info); msg->addU8Fast(_PREHASH_LureType, (U8)0); // sim will fill this in. - msg->addStringFast(_PREHASH_Message, text); +//MK + if (RRenabled && gAgent.mRRInterface.containsWithoutException ("sendim")) + { + msg->addStringFast(_PREHASH_Message, std::string("(Hidden)")); + } + else +//mk + msg->addStringFast(_PREHASH_Message, text); for(LLDynamicArray::iterator itr = invitees->begin(); itr != invitees->end(); ++itr) { msg->nextBlockFast(_PREHASH_TargetData); @@ -4858,6 +5317,24 @@ void handle_lure(LLDynamicArray& ids) LLStringUtil::format_map_t edit_args; edit_args["[REGION]"] = gAgent.getRegion()->getName(); +//MK + if (RRenabled && gAgent.mRRInterface.mContainsShowloc) + { + edit_args["[REGION]"] = "(Hidden)"; + +// // allow the tp offer if and only if the avatar is allowed to send tp offers to ALL +// // the avatars in the list +// for (LLDynamicArray::iterator it = ids.begin(); +// it != ids.end(); ++it) +// { +// if (!gAgent.mRRInterface.contains ("tplure:"+it->asString())) +// { +// // someone in the list is not an exception to tplure => eject +// return; +// } +// } + } +//mk if (gAgent.isGodlike()) { gViewerWindow->alertXmlEditText("OfferTeleportFromGod", edit_args, diff --git a/linden/indra/newview/llviewerobject.cpp b/linden/indra/newview/llviewerobject.cpp index b33b2bb..45a8af5 100644 --- a/linden/indra/newview/llviewerobject.cpp +++ b/linden/indra/newview/llviewerobject.cpp @@ -1007,6 +1007,9 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, coloru.mV[3] = 255 - coloru.mV[3]; mText->setColor(LLColor4(coloru)); mText->setStringUTF8(temp_string); +//MK + mText->mLastMessageText = temp_string; +//mk if (mDrawable.notNull()) { @@ -1424,6 +1427,9 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, coloru.mV[3] = 255 - coloru.mV[3]; mText->setColor(LLColor4(coloru)); mText->setStringUTF8(temp_string); +//MK + mText->mLastMessageText = temp_string; +//mk setChanged(TEXTURE); } diff --git a/linden/indra/newview/llviewerwindow.cpp b/linden/indra/newview/llviewerwindow.cpp index 15e32b8..313800a 100644 --- a/linden/indra/newview/llviewerwindow.cpp +++ b/linden/indra/newview/llviewerwindow.cpp @@ -245,6 +245,10 @@ std::string LLViewerWindow::sSnapshotDir; std::string LLViewerWindow::sMovieBaseName; +//MK +extern BOOL RRenabled; +//mk + extern void toggle_debug_menus(void*); @@ -1630,7 +1634,7 @@ void LLViewerWindow::initBase() LLRect console_rect = full_window; console_rect.mTop -= 24; - console_rect.mBottom += getChatConsoleBottomPad(); + console_rect.mBottom += getChatConsoleBottomPad() + STATUS_BAR_HEIGHT; // TODO: Eliminate magic constants - please used named constants if changing this - don't be a programmer hater console_rect.mLeft += 24; //gSavedSettings.getS32("StatusBarButtonWidth") + gSavedSettings.getS32("StatusBarPad"); @@ -1661,6 +1665,14 @@ void LLViewerWindow::initBase() gDebugView->setVisible(TRUE); mRootView->addChild(gDebugView); + // HUD elements just below floaters + LLRect hud_rect = full_window; + hud_rect.mTop -= 24; + hud_rect.mBottom += STATUS_BAR_HEIGHT; + gHUDView = new LLHUDView("hud_view", hud_rect); + gHUDView->setFollowsAll(); + mRootView->addChild(gHUDView); + // Add floater view at the end so it will be on top, and give it tab priority over others mRootView->addChild(gFloaterView, -1); mRootView->addChild(gSnapshotFloaterView); @@ -1837,10 +1849,27 @@ void LLViewerWindow::initWorldUI() S32 width = mRootView->getRect().getWidth(); LLRect full_window(0, height, width, 0); - if ( gBottomPanel == NULL ) // Don't re-enter if objects are alreay created + if ( gToolBar == NULL ) // Don't re-enter if objects are alreay created { + LLRect bar_rect(-1, STATUS_BAR_HEIGHT, width+1, -1); + gToolBar = new LLToolBar("toolbar", bar_rect); + + LLRect chat_bar_rect(-1,CHAT_BAR_HEIGHT, width+1, -1); + chat_bar_rect.translate(0, STATUS_BAR_HEIGHT-1); + gChatBar = new LLChatBar("chat", chat_bar_rect); + + bar_rect.translate(0, STATUS_BAR_HEIGHT-1); + bar_rect.translate(0, CHAT_BAR_HEIGHT-1); + gOverlayBar = new LLOverlayBar("overlay", bar_rect); + // panel containing chatbar, toolbar, and overlay, over floaters - gBottomPanel = new LLBottomPanel(mRootView->getRect()); + LLRect bottom_rect(-1, 2*STATUS_BAR_HEIGHT + CHAT_BAR_HEIGHT, width+1, -1); + gBottomPanel = new LLBottomPanel("bottom panel", bottom_rect); + + // the order here is important + gBottomPanel->addChild(gChatBar); + gBottomPanel->addChild(gToolBar); + gBottomPanel->addChild(gOverlayBar); mRootView->addChild(gBottomPanel); // View for hover information @@ -2951,9 +2980,23 @@ BOOL LLViewerWindow::handlePerFrameHover() } // Update rectangles for the various toolbars - if (gOverlayBar && gNotifyBoxView && gConsole && gToolBar) + if (gOverlayBar && gNotifyBoxView && gConsole && gToolBar && gChatBar) { LLRect bar_rect(-1, STATUS_BAR_HEIGHT, getWindowWidth()+1, -1); + if (gToolBar->getVisible()) + { + gToolBar->setRect(bar_rect); + bar_rect.translate(0, STATUS_BAR_HEIGHT-1); + } + + if (gChatBar->getVisible()) + { + // fix up the height + LLRect chat_bar_rect = bar_rect; + chat_bar_rect.mTop = chat_bar_rect.mBottom + CHAT_BAR_HEIGHT + 1; + gChatBar->setRect(chat_bar_rect); + bar_rect.translate(0, CHAT_BAR_HEIGHT-1); + } LLRect notify_box_rect = gNotifyBoxView->getRect(); notify_box_rect.mBottom = bar_rect.mBottom; @@ -2971,40 +3014,44 @@ BOOL LLViewerWindow::handlePerFrameHover() gFloaterView->setRect(floater_rect); } - // snap floaters to top of chat bar/button strip - LLView* chatbar_and_buttons = gOverlayBar->getChild("chatbar_and_buttons", TRUE); - // find top of chatbar and state buttons, if either are visible - if (chatbar_and_buttons && !chatbar_and_buttons->getLocalBoundingRect().isNull()) + if (gOverlayBar->getVisible()) { - // convert top/left corner of chatbar/buttons container to gFloaterView-relative coordinates - S32 top, left; - chatbar_and_buttons->localPointToOtherView( - chatbar_and_buttons->getLocalBoundingRect().mLeft, - chatbar_and_buttons->getLocalBoundingRect().mTop, - &left, - &top, - gFloaterView); - gFloaterView->setSnapOffsetBottom(top); - } - else if (gToolBar->getVisible()) - { - S32 top, left; - gToolBar->localPointToOtherView( - gToolBar->getLocalBoundingRect().mLeft, - gToolBar->getLocalBoundingRect().mTop, - &left, - &top, - gFloaterView); - gFloaterView->setSnapOffsetBottom(top); + LLRect overlay_rect = bar_rect; + overlay_rect.mTop = overlay_rect.mBottom + OVERLAY_BAR_HEIGHT; + + // Fitt's Law: Push buttons flush with bottom of screen if + // nothing else visible. + if (!gToolBar->getVisible() + && !gChatBar->getVisible()) + { + // *NOTE: this is highly depenent on the XML + // describing the position of the buttons + overlay_rect.translate(0, 0); + } + + gOverlayBar->setRect(overlay_rect); + gOverlayBar->updateBoundingRect(); + bar_rect.translate(0, gOverlayBar->getRect().getHeight()); + + gFloaterView->setSnapOffsetBottom(OVERLAY_BAR_HEIGHT); } else { gFloaterView->setSnapOffsetBottom(0); } + // fix rectangle of bottom panel focus indicator + if(gBottomPanel && gBottomPanel->getFocusIndicator()) + { + LLRect focus_rect = gBottomPanel->getFocusIndicator()->getRect(); + focus_rect.mTop = (gToolBar->getVisible() ? STATUS_BAR_HEIGHT : 0) + + (gChatBar->getVisible() ? CHAT_BAR_HEIGHT : 0) - 2; + gBottomPanel->getFocusIndicator()->setRect(focus_rect); + } + // Always update console LLRect console_rect = gConsole->getRect(); - console_rect.mBottom = gHUDView->getRect().mBottom + getChatConsoleBottomPad(); + console_rect.mBottom = bar_rect.mBottom - 8; gConsole->reshape(console_rect.getWidth(), console_rect.getHeight()); gConsole->setRect(console_rect); } @@ -3286,6 +3333,20 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls, { moveable_object_selected = TRUE; this_object_movable = TRUE; +//MK + // can't edit objects that someone is sitting on, + // when prevented from sit-tping + LLVOAvatar* avatar = gAgent.getAvatarObject(); + if (RRenabled && (gAgent.mRRInterface.contains ("sittp") + || (gAgent.mRRInterface.mContainsUnsit && avatar && avatar->mIsSitting))) + { + if (object->isSeat()) + { + moveable_object_selected = FALSE; + this_object_movable = FALSE; + } + } +//mk } all_selected_objects_move = all_selected_objects_move && this_object_movable; all_selected_objects_modify = all_selected_objects_modify && object->permModify(); @@ -3640,7 +3701,17 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de { found = gPipeline.lineSegmentIntersectInHUD(mouse_hud_start, mouse_hud_end, pick_transparent, face_hit, intersection, uv, normal, binormal); - +//MK + // HACK : don't allow focusing on HUDs unless we are in Mouselook mode + if (RRenabled && gAgent.getCameraMode() != CAMERA_MODE_MOUSELOOK) + { + MASK mask = gKeyboard->currentMask(TRUE); + if (mask & MASK_ALT) + { + found = NULL; + } + } +//mk if (!found) // if not found in HUD, look in world: { @@ -4032,6 +4103,13 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p LLPipeline::sShowHUDAttachments = FALSE; } +//MK + if (RRenabled && gAgent.mRRInterface.mHasLockedHuds) + { + LLPipeline::sShowHUDAttachments = TRUE; + } +//mk + S32 render_name = gSavedSettings.getS32("RenderName"); gSavedSettings.setS32("RenderName", 0); LLVOAvatar::updateFreezeCounter(1) ; //pause avatar updating for one frame @@ -4170,6 +4248,13 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei LLPipeline::sShowHUDAttachments = FALSE; } +//MK + if (RRenabled && gAgent.mRRInterface.mHasLockedHuds) + { + LLPipeline::sShowHUDAttachments = TRUE; + } +//mk + // Copy screen to a buffer // crop sides or top and bottom, if taking a snapshot of different aspect ratio // from window @@ -5117,22 +5202,17 @@ LLAlertDialog* LLViewerWindow::alertXmlEditText(const std::string& xml_filename, //////////////////////////////////////////////////////////////////////////// -LLBottomPanel::LLBottomPanel(const LLRect &rect) : - LLPanel(LLStringUtil::null, rect, FALSE), +LLBottomPanel::LLBottomPanel(const std::string &name, const LLRect &rect) : + LLPanel(name, rect, FALSE), mIndicator(NULL) { // bottom panel is focus root, so Tab moves through the toolbar and button bar, and overlay setFocusRoot(TRUE); + // don't capture mouse clicks that don't hit a child + setMouseOpaque(FALSE); + setFollows(FOLLOWS_LEFT | FOLLOWS_RIGHT | FOLLOWS_BOTTOM); // flag this panel as chrome so buttons don't grab keyboard focus setIsChrome(TRUE); - - mFactoryMap["toolbar"] = LLCallbackMap(createToolBar, NULL); - mFactoryMap["overlay"] = LLCallbackMap(createOverlayBar, NULL); - mFactoryMap["hud"] = LLCallbackMap(createHUD, NULL); - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_bars.xml", &getFactoryMap()); - - setOrigin(rect.mLeft, rect.mBottom); - reshape(rect.getWidth(), rect.getHeight()); } void LLBottomPanel::setFocusIndicator(LLView * indicator) @@ -5151,28 +5231,6 @@ void LLBottomPanel::draw() LLPanel::draw(); } -void* LLBottomPanel::createHUD(void* data) -{ - delete gHUDView; - gHUDView = new LLHUDView(); - return gHUDView; -} - - -void* LLBottomPanel::createOverlayBar(void* data) -{ - delete gOverlayBar; - gOverlayBar = new LLOverlayBar(); - return gOverlayBar; -} - -void* LLBottomPanel::createToolBar(void* data) -{ - delete gToolBar; - gToolBar = new LLToolBar(); - return gToolBar; -} - // // LLPickInfo // diff --git a/linden/indra/newview/llviewerwindow.h b/linden/indra/newview/llviewerwindow.h index c83c57b..e9b4ebb 100644 --- a/linden/indra/newview/llviewerwindow.h +++ b/linden/indra/newview/llviewerwindow.h @@ -442,15 +442,11 @@ class LLViewerWindow : public LLWindowCallbacks class LLBottomPanel : public LLPanel { public: - LLBottomPanel(const LLRect& rect); + LLBottomPanel(const std::string& name, const LLRect& rect); void setFocusIndicator(LLView * indicator); LLView * getFocusIndicator() { return mIndicator; } /*virtual*/ void draw(); - static void* createHUD(void* data); - static void* createOverlayBar(void* data); - static void* createToolBar(void* data); - protected: LLView * mIndicator; }; diff --git a/linden/indra/newview/llvoavatar.cpp b/linden/indra/newview/llvoavatar.cpp index de67f50..580ca19 100644 --- a/linden/indra/newview/llvoavatar.cpp +++ b/linden/indra/newview/llvoavatar.cpp @@ -125,6 +125,10 @@ #include "llvoicevisualizer.h" #include "llvoiceclient.h" +//MK +extern BOOL RRenabled; +//mk + LLXmlTree LLVOAvatar::sXMLTree; LLXmlTree LLVOAvatar::sSkeletonXMLTree; LLVOAvatarSkeletonInfo* LLVOAvatar::sSkeletonInfo = NULL; @@ -232,7 +236,8 @@ LLVOAvatar::ETextureIndex LLVOAvatar::sBakedTextureIndices[BAKED_TEXTURE_COUNT] LLVOAvatar::TEX_UPPER_BAKED, LLVOAvatar::TEX_LOWER_BAKED, LLVOAvatar::TEX_EYES_BAKED, - LLVOAvatar::TEX_SKIRT_BAKED + LLVOAvatar::TEX_SKIRT_BAKED, + LLVOAvatar::TEX_HAIR_BAKED }; //----------------------------------------------------------------------------- @@ -285,6 +290,7 @@ BOOL LLVOAvatar::sVisibleInFirstPerson = FALSE; F32 LLVOAvatar::sLODFactor = 1.f; BOOL LLVOAvatar::sUseImpostors = FALSE; BOOL LLVOAvatar::sJointDebug = FALSE; +EmeraldGlobalBoobConfig LLVOAvatar::sBoobConfig; S32 LLVOAvatar::sCurJoint = 0; S32 LLVOAvatar::sCurVolume = 0; F32 LLVOAvatar::sUnbakedTime = 0.f; @@ -635,6 +641,7 @@ LLVOAvatar::LLVOAvatar( mLastUpperBodyBakedID( IMG_DEFAULT_AVATAR ), mLastLowerBodyBakedID( IMG_DEFAULT_AVATAR ), mLastEyesBakedID( IMG_DEFAULT_AVATAR ), + mLastHairBakedID(IMG_DEFAULT_AVATAR), mLastSkirtBakedID( IMG_DEFAULT_AVATAR ), mIsDummy(FALSE), mSpecialRenderMode(0), @@ -657,6 +664,7 @@ LLVOAvatar::LLVOAvatar( mUpperBodyLayerSet( NULL ), mLowerBodyLayerSet( NULL ), mEyesLayerSet( NULL ), + mHairLayerSet(NULL), mSkirtLayerSet( NULL ), mRenderPriority(1.0f), mNameString(), @@ -677,6 +685,7 @@ LLVOAvatar::LLVOAvatar( mLowerBakedLoaded(FALSE), mLowerMaskDiscard(-1), mEyesBakedLoaded(FALSE), + mHairBakedLoaded(FALSE), mSkirtBakedLoaded(FALSE), mHeadMaskTexName(0), mUpperMaskTexName(0), @@ -689,9 +698,14 @@ LLVOAvatar::LLVOAvatar( mTexSkinColor( NULL ), mTexHairColor( NULL ), mTexEyeColor( NULL ), + mHasBakedHair(FALSE), + mSupportsAlphaLayers(FALSE), mNeedsSkin(FALSE), mUpdatePeriod(1), - mFullyLoadedInitialized(FALSE) + mFullyLoadedInitialized(FALSE), + mFirstSetActualBoobGravRan( false ), + mFirstSetActualButtGravRan( false ), + mFirstSetActualFatGravRan( false ) { LLMemType mt(LLMemType::MTYPE_AVATAR); @@ -947,6 +961,16 @@ LLVOAvatar::LLVOAvatar( } + // grab the boob savedparams (prob a better place for this) + sBoobConfig.mass = EmeraldBoobUtils::convertMass(gSavedSettings.getF32("EmeraldBoobMass")); + sBoobConfig.hardness = EmeraldBoobUtils::convertHardness(gSavedSettings.getF32("EmeraldBoobHardness")); + sBoobConfig.velMax = EmeraldBoobUtils::convertVelMax(gSavedSettings.getF32("EmeraldBoobVelMax")); + sBoobConfig.velMin = EmeraldBoobUtils::convertVelMin(gSavedSettings.getF32("EmeraldBoobVelMin")); + sBoobConfig.friction = EmeraldBoobUtils::convertFriction(gSavedSettings.getF32("EmeraldBoobFriction")); + sBoobConfig.enabled = gSavedSettings.getBOOL("EmeraldBreastPhysicsToggle"); + sBoobConfig.XYInfluence = gSavedSettings.getF32("EmeraldBoobXYInfluence"); + + if (gNoRender) { return; @@ -1001,6 +1025,9 @@ LLVOAvatar::~LLVOAvatar() delete mEyesLayerSet; mEyesLayerSet = NULL; + delete mHairLayerSet; + mHairLayerSet = NULL; + delete mSkirtLayerSet; mSkirtLayerSet = NULL; @@ -1052,15 +1079,16 @@ BOOL LLVOAvatar::isFullyBaked() BOOL upper_baked = ( getTEImage( TEX_UPPER_BAKED )->getID() != IMG_DEFAULT_AVATAR ); BOOL lower_baked = ( getTEImage( TEX_LOWER_BAKED )->getID() != IMG_DEFAULT_AVATAR ); BOOL eyes_baked = ( getTEImage( TEX_EYES_BAKED )->getID() != IMG_DEFAULT_AVATAR ); + BOOL hair_baked = ( getTEImage( TEX_HAIR_BAKED )->getID() != IMG_DEFAULT_AVATAR); BOOL skirt_baked = ( getTEImage( TEX_SKIRT_BAKED )->getID() != IMG_DEFAULT_AVATAR ); if (isWearingWearableType(WT_SKIRT)) { - return head_baked && upper_baked && lower_baked && eyes_baked && skirt_baked; + return head_baked && upper_baked && lower_baked && eyes_baked && hair_baked && skirt_baked; } else { - return head_baked && upper_baked && lower_baked && eyes_baked; + return head_baked && upper_baked && lower_baked && eyes_baked && hair_baked; } } @@ -1070,6 +1098,7 @@ void LLVOAvatar::deleteLayerSetCaches() if( mUpperBodyLayerSet ) mUpperBodyLayerSet->deleteCaches(); if( mLowerBodyLayerSet ) mLowerBodyLayerSet->deleteCaches(); if( mEyesLayerSet ) mEyesLayerSet->deleteCaches(); + if (mHairLayerSet) mHairLayerSet->deleteCaches(); if( mSkirtLayerSet ) mSkirtLayerSet->deleteCaches(); if(mUpperMaskTexName) @@ -1203,6 +1232,11 @@ void LLVOAvatar::dumpBakedStatus() llcont << " eyes"; } + if (inst->getTEImage( TEX_HAIR_BAKED )->getID() == IMG_DEFAULT_AVATAR ) + { + llcont << " hair"; + } + if (inst->isWearingWearableType(WT_SKIRT)) { if( inst->getTEImage( TEX_SKIRT_BAKED )->getID() == IMG_DEFAULT_AVATAR ) @@ -1318,11 +1352,12 @@ void LLVOAvatar::restoreGL() { LLVOAvatar* inst = (LLVOAvatar*) *iter; inst->setCompositeUpdatesEnabled( TRUE ); - inst->invalidateComposite( inst->mHeadLayerSet, FALSE ); + inst->invalidateComposite( inst->mHeadLayerSet, FALSE ); inst->invalidateComposite( inst->mLowerBodyLayerSet, FALSE ); inst->invalidateComposite( inst->mUpperBodyLayerSet, FALSE ); - inst->invalidateComposite( inst->mEyesLayerSet, FALSE ); - inst->invalidateComposite( inst->mSkirtLayerSet, FALSE ); + inst->invalidateComposite( inst->mEyesLayerSet, FALSE ); + inst->invalidateComposite( inst->mHairLayerSet, FALSE ); + inst->invalidateComposite( inst->mSkirtLayerSet, FALSE ); inst->updateMeshTextures(); } } @@ -2414,7 +2449,7 @@ void LLVOAvatar::updateMeshData() for(S32 k = j ; k < part_index ; k++) { - av_parts[k]->updateFaceData(facep, mAdjustedPixelArea, (k == 7)); + av_parts[k]->updateFaceData(facep, mAdjustedPixelArea, (k == MESH_ID_HAIR)); } stop_glerror(); @@ -2671,6 +2706,7 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) idleUpdateVoiceVisualizer( voice_enabled ); idleUpdateMisc( detailed_update ); idleUpdateAppearanceAnimation(); + idleUpdateBoobEffect(); idleUpdateLipSync( voice_enabled ); idleUpdateLoadingEffect(); idleUpdateBelowWater(); // wind effect uses this @@ -2924,6 +2960,8 @@ void LLVOAvatar::idleUpdateAppearanceAnimation() { if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) { + // so boobs don't go spastic when a shape's changed, but still seems buggy + //if(param->getID() != 507) param->animate(morph_amt, mAppearanceAnimSetByUser); } } @@ -2942,6 +2980,107 @@ void LLVOAvatar::idleUpdateAppearanceAnimation() } } +// ------------------------------------------------------------ +// Danny: ZOMG Boob Phsyics go! +// ------------------------------------------------------------ +void LLVOAvatar::idleUpdateBoobEffect() +{ + if(mFirstSetActualBoobGravRan) + { + // should probably be moved somewhere where it is only called when boobsize changes + LLVisualParam *param; + + // BOOBS + param = getVisualParam(105); //boob size + mLocalBoobConfig.boobSize = param->getCurrentWeight(); + EmeraldBoobInputs boobInputs; + boobInputs.type = 0; + boobInputs.chestPosition = mChestp->getWorldPosition(); + boobInputs.chestRotation = mChestp->getWorldRotation(); + boobInputs.elapsedTime = mBoobBounceTimer.getElapsedTimeF32(); + boobInputs.appearanceFlag = getAppearanceFlag(); + + + EmeraldBoobState newBoobState = EmeraldBoobUtils::idleUpdate(sBoobConfig, mLocalBoobConfig, mBoobState, boobInputs); + + if(mBoobState.boobGrav != newBoobState.boobGrav) + { + LLVisualParam *param; + param = getVisualParam(507); + + ESex avatar_sex = getSex(); + + param->stopAnimating(FALSE); + param->setWeight(llclamp(newBoobState.boobGrav+getActualBoobGrav(), -1.5f, 2.f), FALSE); + param->apply(avatar_sex); + updateVisualParams(); + } + + mBoobState = newBoobState; + } + /* + if(mFirstSetActualButtGravRan) + { + // BUTT + EmeraldBoobInputs buttInputs; + buttInputs.type = 1; + buttInputs.chestPosition = mPelvisp->getWorldPosition(); + buttInputs.chestRotation = mPelvisp->getWorldRotation(); + buttInputs.elapsedTime = mBoobBounceTimer.getElapsedTimeF32(); + buttInputs.appearanceFlag = getAppearanceFlag(); + + + EmeraldBoobState newButtState = EmeraldBoobUtils::idleUpdate(sBoobConfig, mLocalBoobConfig, mButtState, buttInputs); + + if(mButtState.boobGrav != newButtState.boobGrav) + { + LLVisualParam *param; + param = getVisualParam(795); + + ESex avatar_sex = getSex(); + + param->stopAnimating(FALSE); + param->setWeight(newButtState.boobGrav*0.3f+getActualButtGrav(), FALSE); + param->apply(avatar_sex); + updateVisualParams(); + } + + mButtState = newButtState; + } + + if(mFirstSetActualFatGravRan) + { + // FAT + EmeraldBoobInputs fatInputs; + fatInputs.type = 2; + fatInputs.chestPosition = mPelvisp->getWorldPosition(); + fatInputs.chestRotation = mPelvisp->getWorldRotation(); + fatInputs.elapsedTime = mBoobBounceTimer.getElapsedTimeF32(); + fatInputs.appearanceFlag = getAppearanceFlag(); + + + EmeraldBoobState newFatState = EmeraldBoobUtils::idleUpdate(sBoobConfig, mLocalBoobConfig, mFatState, fatInputs); + + if(mFatState.boobGrav != newFatState.boobGrav) + { + LLVisualParam *param; + param = getVisualParam(157); + + ESex avatar_sex = getSex(); + + param->stopAnimating(FALSE); + param->setWeight(newFatState.boobGrav*0.3f+getActualFatGrav(), FALSE); + param->apply(avatar_sex); + updateVisualParams(); + } + + mFatState = newFatState; + } + */ + +} + + void LLVOAvatar::idleUpdateLipSync(bool voice_enabled) { // Use the Lipsync_Ooh and Lipsync_Aah morphs for lip sync @@ -3103,7 +3242,13 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last) && !gAgent.cameraMouselook() && (visible_chat || !gSavedSettings.getBOOL("RenderNameHideSelf")); } - +//MK + // hide the names above the heads + if (RRenabled && gAgent.mRRInterface.mContainsShownames) + { + render_name = FALSE; + } +//mk if ( render_name ) { BOOL new_name = FALSE; @@ -3575,6 +3720,10 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) { //back 25% of max visible avatars are slow updating impostors mUpdatePeriod = 8; } + else if (visible && mVisibilityRank > (U32) LLVOAvatar::sMaxVisible) + { //background avatars are REALLY slow updating impostors + mUpdatePeriod = 16; + } else if (visible && mImpostorPixelArea <= impostor_area) { // stuff in between gets an update period based on pixel area mUpdatePeriod = llclamp((S32) sqrtf(impostor_area*4.f/mImpostorPixelArea), 2, 8); @@ -4292,22 +4441,49 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass) if (pass == AVATAR_RENDER_PASS_SINGLE) { + const bool should_alpha_mask = mSupportsAlphaLayers && mHasBakedHair + && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked + && !LLDrawPoolAvatar::sSkipTransparent; + LLGLState test(GL_ALPHA_TEST, should_alpha_mask); + + if (should_alpha_mask) + { + gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f); + } + BOOL first_pass = TRUE; + if (!LLDrawPoolAvatar::sSkipOpaque) + { if (!mIsSelf || gAgent.needsRenderHead()) { - num_indices += mHeadLOD.render(mAdjustedPixelArea); + if (isTextureVisible(TEX_HEAD_BAKED) || mIsDummy) + { + num_indices += mHeadLOD.render(mAdjustedPixelArea, first_pass); + first_pass = FALSE; + } + } + if (isTextureVisible(TEX_UPPER_BAKED) || mIsDummy) + { + num_indices += mUpperBodyLOD.render(mAdjustedPixelArea, first_pass); first_pass = FALSE; } - num_indices += mUpperBodyLOD.render(mAdjustedPixelArea, first_pass); - num_indices += mLowerBodyLOD.render(mAdjustedPixelArea, FALSE); + if (isTextureVisible(TEX_LOWER_BAKED) || mIsDummy) + { + num_indices += mLowerBodyLOD.render(mAdjustedPixelArea, first_pass); + first_pass = FALSE; + } + } + + gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); + if (!LLDrawPoolAvatar::sSkipTransparent || LLPipeline::sImpostorRender) { - LLGLEnable blend(GL_BLEND); - LLGLEnable test(GL_ALPHA_TEST); - num_indices += renderTransparent(); + LLGLState blend(GL_BLEND, !mIsDummy); + LLGLState test(GL_ALPHA_TEST, !mIsDummy); + num_indices += renderTransparent(first_pass); } } - + LLViewerJointMesh::sRenderPass = AVATAR_RENDER_PASS_SINGLE; //llinfos << "Avatar render: " << render_timer.getElapsedTimeF32() << llendl; @@ -4317,11 +4493,10 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass) return num_indices; } -U32 LLVOAvatar::renderTransparent() +U32 LLVOAvatar::renderTransparent(BOOL first_pass) { U32 num_indices = 0; - BOOL first_pass = FALSE; - if( isWearingWearableType( WT_SKIRT ) ) + if( isWearingWearableType( WT_SKIRT ) && (mIsDummy || isTextureVisible(TEX_SKIRT_BAKED)) ) { gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.25f); num_indices += mSkirtLOD.render(mAdjustedPixelArea, FALSE); @@ -4335,8 +4510,19 @@ U32 LLVOAvatar::renderTransparent() { gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f); } - num_indices += mEyeLashLOD.render(mAdjustedPixelArea, first_pass); - num_indices += mHairLOD.render(mAdjustedPixelArea, FALSE); + + if (isTextureVisible(TEX_HEAD_BAKED)) + { + num_indices += mEyeLashLOD.render(mAdjustedPixelArea, first_pass); + first_pass = FALSE; + } + // Can't test for baked hair being defined, since that won't always be the case (not all viewers send baked hair) + // TODO: 1.25 will be able to switch this logic back to calling isTextureVisible(); + if (getTEImage(TEX_HAIR_BAKED)->getID() != IMG_INVISIBLE || LLDrawPoolAlpha::sShowDebugAlpha) + { + num_indices += mHairLOD.render(mAdjustedPixelArea, first_pass); + first_pass = FALSE; + } if (LLPipeline::sImpostorRender) { gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); @@ -4368,9 +4554,25 @@ U32 LLVOAvatar::renderRigid() return 0; } - num_indices += mEyeBallLeftLOD.render(mAdjustedPixelArea); - num_indices += mEyeBallRightLOD.render(mAdjustedPixelArea); - + const bool should_alpha_mask = mSupportsAlphaLayers && mHasBakedHair + && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked + && !LLDrawPoolAvatar::sSkipTransparent; + + LLGLState test(GL_ALPHA_TEST, should_alpha_mask); + + if (should_alpha_mask) + { + gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f); + } + + if (isTextureVisible(TEX_EYES_BAKED) || mIsDummy) + { + num_indices += mEyeBallLeftLOD.render(mAdjustedPixelArea, TRUE); + num_indices += mEyeBallRightLOD.render(mAdjustedPixelArea, TRUE); + } + + gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); + return num_indices; } @@ -4392,6 +4594,13 @@ U32 LLVOAvatar::renderFootShadows() { return 0; } + + // Don't render foot shadows if your lower body is completely invisible. + // (non-humanoid avatars rule!) + if (! isTextureVisible(TEX_LOWER_BAKED)) + { + return 0; + } // Update the shadow, tractor, and text label geometry. if (mDrawable->isState(LLDrawable::REBUILD_SHADOW) && !isImpostor()) @@ -4434,23 +4643,6 @@ U32 LLVOAvatar::renderImpostor(LLColor4U color) LLGLEnable test(GL_ALPHA_TEST); gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f); - F32 blend = gFrameTimeSeconds - mFadeTime; - - LLGLState gl_blend(GL_BLEND, blend < 1.f ? TRUE : FALSE); - gGL.setSceneBlendType(LLRender::BT_ALPHA); - - F32 alpha; - if (mVisibilityRank >= (U32) LLVOAvatar::sMaxVisible) - { //fade out - alpha = 1.f - llmin(blend, 1.f); - } - else - { //fade in - alpha = llmin(blend, 1.f); - } - - color.mV[3] = (U8) (alpha*255); - gGL.color4ubv(color.mV); gGL.getTexUnit(0)->bind(&mImpostor); gGL.begin(LLRender::QUADS); @@ -4484,6 +4676,7 @@ void LLVOAvatar::updateTextures(LLAgent &agent) BOOL upper_baked = ( getTEImage( TEX_UPPER_BAKED )->getID() != IMG_DEFAULT_AVATAR ); BOOL lower_baked = ( getTEImage( TEX_LOWER_BAKED )->getID() != IMG_DEFAULT_AVATAR ); BOOL eyes_baked = ( getTEImage( TEX_EYES_BAKED )->getID() != IMG_DEFAULT_AVATAR ); + BOOL hair_baked = ( getTEImage(TEX_HAIR_BAKED )->getID() != IMG_DEFAULT_AVATAR); BOOL skirt_baked = ( getTEImage( TEX_SKIRT_BAKED )->getID() != IMG_DEFAULT_AVATAR ); if( mIsSelf ) @@ -4516,6 +4709,10 @@ void LLVOAvatar::updateTextures(LLAgent &agent) { gGL.getTexUnit(0)->bind(getTEImage( TEX_EYES_BAKED )); } + if (hair_baked && !mHairBakedLoaded) + { + gGL.getTexUnit(0)->bind(getTEImage( TEX_HAIR_BAKED )); + } if( skirt_baked && ! mSkirtBakedLoaded ) { gGL.getTexUnit(0)->bind(getTEImage( TEX_SKIRT_BAKED )); @@ -4571,6 +4768,7 @@ void LLVOAvatar::updateTextures(LLAgent &agent) // Spam if this is a baked texture, not set to default image, without valid host info if (isTextureIndexBaked(i) && imagep->getID() != IMG_DEFAULT_AVATAR + && imagep->getID() != IMG_INVISIBLE && !imagep->getTargetHost().isOk()) { llwarns << "LLVOAvatar::updateTextures No host for texture " @@ -4586,6 +4784,14 @@ void LLVOAvatar::updateTextures(LLAgent &agent) addLocalTextureStats( LOCTEX_HEAD_BODYPAINT, imagep, texel_area_ratio, render_avatar, head_baked ); break; + case TEX_HEAD_ALPHA: + addLocalTextureStats( LOCTEX_HEAD_ALPHA, imagep, texel_area_ratio, render_avatar, head_baked ); + break; + + case TEX_HEAD_TATTOO: + addLocalTextureStats( LOCTEX_HEAD_TATTOO, imagep, texel_area_ratio, render_avatar, head_baked ); + break; + // Upper case TEX_UPPER_JACKET: addLocalTextureStats( LOCTEX_UPPER_JACKET, imagep, texel_area_ratio, render_avatar, upper_baked ); @@ -4607,6 +4813,14 @@ void LLVOAvatar::updateTextures(LLAgent &agent) addLocalTextureStats( LOCTEX_UPPER_BODYPAINT, imagep, texel_area_ratio, render_avatar, upper_baked ); break; + case TEX_UPPER_ALPHA: + addLocalTextureStats( LOCTEX_UPPER_ALPHA, imagep, texel_area_ratio, render_avatar, upper_baked ); + break; + + case TEX_UPPER_TATTOO: + addLocalTextureStats( LOCTEX_UPPER_TATTOO, imagep, texel_area_ratio, render_avatar, upper_baked ); + break; + // Lower case TEX_LOWER_JACKET: addLocalTextureStats( LOCTEX_LOWER_JACKET, imagep, texel_area_ratio, render_avatar, lower_baked ); @@ -4632,16 +4846,37 @@ void LLVOAvatar::updateTextures(LLAgent &agent) addLocalTextureStats( LOCTEX_LOWER_BODYPAINT, imagep, texel_area_ratio, render_avatar, lower_baked ); break; + case TEX_LOWER_ALPHA: + addLocalTextureStats( LOCTEX_LOWER_ALPHA, imagep, texel_area_ratio, render_avatar, lower_baked ); + break; + + case TEX_LOWER_TATTOO: + addLocalTextureStats( LOCTEX_LOWER_TATTOO, imagep, texel_area_ratio, render_avatar, lower_baked ); + break; + // Eyes case TEX_EYES_IRIS: addLocalTextureStats( LOCTEX_EYES_IRIS, imagep, texel_area_ratio, render_avatar, eyes_baked ); break; + case TEX_EYES_ALPHA: + addLocalTextureStats( LOCTEX_EYES_ALPHA, imagep, texel_area_ratio, render_avatar, eyes_baked ); + break; + // Skirt case TEX_SKIRT: addLocalTextureStats( LOCTEX_SKIRT, imagep, texel_area_ratio, render_avatar, skirt_baked ); break; + // Hair + case TEX_HAIR: + addLocalTextureStats( LOCTEX_HAIR, imagep, texel_area_ratio, render_avatar, hair_baked ); + break; + + case TEX_HAIR_ALPHA: + addLocalTextureStats( LOCTEX_HAIR_ALPHA, imagep, texel_area_ratio, render_avatar, hair_baked ); + break; + // Baked case TEX_HEAD_BAKED: if (head_baked) @@ -4678,12 +4913,11 @@ void LLVOAvatar::updateTextures(LLAgent &agent) } break; - case TEX_HAIR: - // Hair is neither a local texture used for baking, nor the output - // of the baking process. It's just a texture that happens to be - // used to draw avatars. Hence BOOST_AVATAR. JC - boost_level = mIsSelf ? LLViewerImage::BOOST_AVATAR_SELF : LLViewerImage::BOOST_AVATAR; - addBakedTextureStats( imagep, mPixelArea, texel_area_ratio, boost_level ); + case TEX_HAIR_BAKED: + if (hair_baked) + { + addBakedTextureStats( imagep, mPixelArea, texel_area_ratio, boost_level ); + } break; default: @@ -5449,6 +5683,10 @@ BOOL LLVOAvatar::loadAvatar() { mEyesLayerSet = layer_set; } + else if( layer_set->isBodyRegion( "hair" ) ) + { + mHairLayerSet = layer_set; + } else if( layer_set->isBodyRegion( "skirt" ) ) { mSkirtLayerSet = layer_set; @@ -6199,6 +6437,8 @@ void LLVOAvatar::requestLayerSetUpdate( LLVOAvatar::ELocTexIndex i ) switch( i ) { case LOCTEX_HEAD_BODYPAINT: + case LOCTEX_HEAD_ALPHA: + case LOCTEX_HEAD_TATTOO: if( mHeadLayerSet ) { mHeadLayerSet->requestUpdate(); @@ -6209,6 +6449,8 @@ void LLVOAvatar::requestLayerSetUpdate( LLVOAvatar::ELocTexIndex i ) case LOCTEX_UPPER_SHIRT: case LOCTEX_UPPER_GLOVES: case LOCTEX_UPPER_UNDERSHIRT: + case LOCTEX_UPPER_ALPHA: + case LOCTEX_UPPER_TATTOO: if( mUpperBodyLayerSet ) { mUpperBodyLayerSet->requestUpdate(); @@ -6220,6 +6462,8 @@ void LLVOAvatar::requestLayerSetUpdate( LLVOAvatar::ELocTexIndex i ) case LOCTEX_LOWER_SHOES: case LOCTEX_LOWER_SOCKS: case LOCTEX_LOWER_UNDERPANTS: + case LOCTEX_LOWER_ALPHA: + case LOCTEX_LOWER_TATTOO: if( mLowerBodyLayerSet ) { mLowerBodyLayerSet->requestUpdate(); @@ -6227,6 +6471,7 @@ void LLVOAvatar::requestLayerSetUpdate( LLVOAvatar::ELocTexIndex i ) break; case LOCTEX_EYES_IRIS: + case LOCTEX_EYES_ALPHA: if( mEyesLayerSet ) { mEyesLayerSet->requestUpdate(); @@ -6234,6 +6479,15 @@ void LLVOAvatar::requestLayerSetUpdate( LLVOAvatar::ELocTexIndex i ) break; + case LOCTEX_HAIR: + case LOCTEX_HAIR_ALPHA: + if (mHairLayerSet) + { + mHairLayerSet->requestUpdate(); + } + break; + + case LOCTEX_SKIRT: if( mSkirtLayerSet ) { @@ -6325,6 +6579,63 @@ BOOL LLVOAvatar::attachObject(LLViewerObject *viewer_object) return FALSE; } +//MK + if (RRenabled) + { + // if this inventory item is shared and does not contain any attachment info in its name, rename it for later (truncate the name first if needed) + LLViewerInventoryItem* item = gInventory.getItem (attachment->getItemID()); + if (item && gAgent.mRRInterface.isUnderRlvShare (item)) + { + if (gAgent.mRRInterface.findAttachmentPointFromName (item->getName()) == NULL) + { + if (item->isComplete()) + { + std::string attach_name = getAttachedPointName (item->getUUID()); + LLStringUtil::toLower (attach_name); + std::string item_name = item->getName(); + if (item_name.length() >= DB_INV_ITEM_NAME_STR_LEN - 16) + { + // truncate if the original name is too long + item_name = item_name.substr (0, DB_INV_ITEM_NAME_STR_LEN - 16); + } + + if (item->getPermissions().allowModifyBy(gAgent.getID())) + { + // add the name of the attach point at the end of the name of the item + item->rename(item_name + " (" + attach_name + ")"); + item->updateServer (FALSE); + } + else + { + // this item is no-mod, so we have to rename its parent directory instead, + // provided it is at least 2 levels below the shared root (we already know + // that the item is shared) + LLViewerInventoryCategory* cat_parent; + LLViewerInventoryCategory* cat_grandparent; + LLInventoryCategory* rlv_share = gAgent.mRRInterface.getRlvShare(); + const LLUUID& parent_id = item->getParentUUID(); + cat_parent = gInventory.getCategory (parent_id); + const LLUUID& grandparent_id = cat_parent->getParentUUID(); + cat_grandparent = gInventory.getCategory (grandparent_id); + if (cat_parent && cat_grandparent + && (LLInventoryCategory*)cat_parent != rlv_share + && (LLInventoryCategory*)cat_grandparent != rlv_share) + { + if (gAgent.mRRInterface.findAttachmentPointFromName (cat_parent->getName()) + == NULL) + { + cat_parent->rename(".(" + attach_name + ")"); // don't write the whole name, it could contain commas (",") and fool @getinv + cat_parent->updateServer (FALSE); + gInventory.updateCategory (cat_parent); + } + } + } + } + } + } + } +//mk + if (viewer_object->isSelected()) { LLSelectMgr::getInstance()->updateSelectionCenter(); @@ -6447,6 +6758,12 @@ void LLVOAvatar::sitOnObject(LLViewerObject *sit_object) mDrawable->mXform.setRotation(mDrawable->getWorldRotation() * inv_obj_rot); gPipeline.markMoved(mDrawable, TRUE); +//MK + if (RRenabled) + { + gAgent.mRRInterface.setSitTargetId (sit_object->getID()); + } +//mk mIsSitting = TRUE; mRoot.getXform()->setParent(&sit_object->mDrawable->mXform); // LLVOAvatar::sitOnObject mRoot.setPosition(getPosition()); @@ -6484,6 +6801,12 @@ void LLVOAvatar::getOffObject() if (sit_object) { +//MK + if (RRenabled) + { + gAgent.mRRInterface.setSitTargetId (LLUUID::null); + } +//mk stopMotionFromSource(sit_object->getID()); LLFollowCamMgr::setCameraActive(sit_object->getID(), FALSE); @@ -6684,6 +7007,11 @@ void LLVOAvatar::updateComposites() mEyesLayerSet->updateComposite(); } + if ( mHairLayerSet ) + { + mHairLayerSet->updateComposite(); + } + if( mSkirtLayerSet && isWearingWearableType( WT_SKIRT )) { mSkirtLayerSet->updateComposite(); @@ -6738,6 +7066,10 @@ void LLVOAvatar::invalidateComposite( LLTexLayerSet* layerset, BOOL set_by_user { layer_name = "eyes"; } + else if (layerset == mHairLayerSet) + { + layer_name = "hair"; + } else if (layerset == mSkirtLayerSet) { layer_name = "skirt"; @@ -6782,15 +7114,21 @@ void LLVOAvatar::onGlobalColorChanged( LLTexGlobalColor* global_color, BOOL set_ if( global_color == mTexHairColor ) { // llinfos << "invalidateComposite cause: onGlobalColorChanged( hair color )" << llendl; - invalidateComposite( mHeadLayerSet, set_by_user ); + invalidateComposite(mHeadLayerSet, set_by_user); + invalidateComposite(mHairLayerSet, set_by_user); - LLColor4 color = mTexHairColor->getColor(); - mHairMesh0.setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] ); - mHairMesh1.setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] ); - mHairMesh2.setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] ); - mHairMesh3.setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] ); - mHairMesh4.setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] ); - mHairMesh5.setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] ); + // ! BACKWARDS COMPATIBILITY ! + // Fix for dealing with avatars from viewers that don't bake hair. + if (getTEImage(TEX_HAIR_BAKED)->getID() == IMG_DEFAULT_AVATAR) + { + LLColor4 color = mTexHairColor->getColor(); + mHairMesh0.setColor(color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW]); + mHairMesh1.setColor(color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW]); + mHairMesh2.setColor(color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW]); + mHairMesh3.setColor(color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW]); + mHairMesh4.setColor(color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW]); + mHairMesh5.setColor(color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW]); + } } else if( global_color == mTexEyeColor ) @@ -6919,10 +7257,10 @@ BOOL LLVOAvatar::getLocalTextureGL(S32 index, LLImageGL** image_gl_pp) } } - if( !success ) - { +// if( !success ) +// { // llinfos << "getLocalTextureGL(" << index << ") had no data" << llendl; - } +// } return success; } @@ -6956,8 +7294,7 @@ void LLVOAvatar::dumpTotalLocalTextureByteCount() BOOL LLVOAvatar::isVisible() { return mDrawable.notNull() - && (mDrawable->isVisible() || mIsDummy) - && (mVisibilityRank < (U32) sMaxVisible || gFrameTimeSeconds - mFadeTime < 1.f); + && (mDrawable->isVisible() || mIsDummy); } @@ -6976,8 +7313,15 @@ BOOL LLVOAvatar::updateIsFullyLoaded() loading = TRUE; } - // are our texture settings still default? - if ((getTEImage( TEX_HAIR )->getID() == IMG_DEFAULT)) + // + if (mIsSelf) + { + if (!isTextureDefined(TEX_HAIR)) + { + loading = TRUE; + } + } + else if (!isTextureDefined(TEX_LOWER_BAKED) || !isTextureDefined(TEX_UPPER_BAKED) || !isTextureDefined(TEX_HEAD_BAKED)) { loading = TRUE; } @@ -7145,8 +7489,8 @@ LLGLuint LLVOAvatar::getScratchTexName( LLGLenum format, U32* texture_bytes ) 0, format, GL_UNSIGNED_BYTE, NULL ); stop_glerror(); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); stop_glerror(); @@ -7214,6 +7558,7 @@ void LLVOAvatar::setupComposites() BOOL upper_baked = ( getTEImage( TEX_UPPER_BAKED )->getID() != IMG_DEFAULT_AVATAR ); BOOL lower_baked = ( getTEImage( TEX_LOWER_BAKED )->getID() != IMG_DEFAULT_AVATAR ); BOOL eyes_baked = ( getTEImage( TEX_EYES_BAKED )->getID() != IMG_DEFAULT_AVATAR ); + BOOL hair_baked = ( getTEImage( TEX_HAIR_BAKED )->getID() != IMG_DEFAULT_AVATAR ); BOOL skirt_baked = ( getTEImage( TEX_SKIRT_BAKED )->getID() != IMG_DEFAULT_AVATAR ); if (mHeadLayerSet) @@ -7230,11 +7575,15 @@ void LLVOAvatar::setupComposites() } if (mEyesLayerSet) { - mEyesLayerSet->setUpdatesEnabled( !eyes_baked ); + mEyesLayerSet->setUpdatesEnabled( !eyes_baked ); + } + if (mHairLayerSet) + { + mHairLayerSet->setUpdatesEnabled( !hair_baked ); } if (mSkirtLayerSet) { - mSkirtLayerSet->setUpdatesEnabled( !skirt_baked ); + mSkirtLayerSet->setUpdatesEnabled( !skirt_baked ); } } @@ -7275,17 +7624,23 @@ void LLVOAvatar::updateMeshTextures() BOOL upper_baked = (getTEImage( TEX_UPPER_BAKED )->getID() != IMG_DEFAULT_AVATAR ); BOOL lower_baked = (getTEImage( TEX_LOWER_BAKED )->getID() != IMG_DEFAULT_AVATAR ); BOOL eyes_baked = (getTEImage( TEX_EYES_BAKED )->getID() != IMG_DEFAULT_AVATAR ); + BOOL hair_baked = (getTEImage( TEX_HAIR_BAKED )->getID() != IMG_DEFAULT_AVATAR ); BOOL skirt_baked = (getTEImage( TEX_SKIRT_BAKED )->getID() != IMG_DEFAULT_AVATAR ); + // Turn on alpha masking correctly for yourself and other avatars on 1.19.2 or 1.22+ + mSupportsAlphaLayers = mIsSelf || hair_baked; + mHasBakedHair = self_customize || !hair_baked; + // Nothing should be baked if we're in customize avatar mode. llassert( !( self_customize && - ( head_baked || upper_baked || lower_baked || eyes_baked ) ) ); + ( head_baked || upper_baked || lower_baked || eyes_baked || hair_baked ) ) ); BOOL use_lkg_head_baked = FALSE; BOOL use_lkg_upper_baked = FALSE; BOOL use_lkg_lower_baked = FALSE; BOOL use_lkg_eyes_baked = FALSE; - BOOL use_lkg_skirt_baked = FALSE; + BOOL use_lkg_hair_baked = FALSE; + BOOL use_lkg_skirt_baked = FALSE; BOOL other_culled = !mIsSelf && mCulled; if( other_culled ) @@ -7294,6 +7649,7 @@ void LLVOAvatar::updateMeshTextures() use_lkg_upper_baked = !upper_baked && (mLastUpperBodyBakedID != IMG_DEFAULT_AVATAR); use_lkg_lower_baked = !lower_baked && (mLastLowerBodyBakedID != IMG_DEFAULT_AVATAR); use_lkg_eyes_baked = !eyes_baked && (mLastEyesBakedID != IMG_DEFAULT_AVATAR); + use_lkg_hair_baked = !hair_baked && (mLastHairBakedID != IMG_DEFAULT_AVATAR); use_lkg_skirt_baked = !skirt_baked && (mLastSkirtBakedID != IMG_DEFAULT_AVATAR); if( mHeadLayerSet ) @@ -7316,6 +7672,11 @@ void LLVOAvatar::updateMeshTextures() mEyesLayerSet->destroyComposite(); } + if (mHairLayerSet) + { + mHairLayerSet->destroyComposite(); + } + if( mSkirtLayerSet ) { mSkirtLayerSet->destroyComposite(); @@ -7323,7 +7684,6 @@ void LLVOAvatar::updateMeshTextures() } else - if( !self_customize ) { // When you're changing clothes and you're not in Appearance mode, // use the last-known good baked texture until you finish the first @@ -7332,6 +7692,7 @@ void LLVOAvatar::updateMeshTextures() use_lkg_upper_baked = !upper_baked && (mLastUpperBodyBakedID != IMG_DEFAULT_AVATAR) && mUpperBodyLayerSet && !mUpperBodyLayerSet->getComposite()->isInitialized(); use_lkg_lower_baked = !lower_baked && (mLastLowerBodyBakedID != IMG_DEFAULT_AVATAR) && mLowerBodyLayerSet && !mLowerBodyLayerSet->getComposite()->isInitialized(); use_lkg_eyes_baked = !eyes_baked && (mLastEyesBakedID != IMG_DEFAULT_AVATAR) && mEyesLayerSet && !mEyesLayerSet->getComposite()->isInitialized(); + use_lkg_hair_baked = !hair_baked && (mLastHairBakedID != IMG_DEFAULT_AVATAR) && mHairLayerSet && !mHairLayerSet->getComposite()->isInitialized(); use_lkg_skirt_baked = !skirt_baked && (mLastSkirtBakedID != IMG_DEFAULT_AVATAR) && mSkirtLayerSet && !mSkirtLayerSet->getComposite()->isInitialized(); if( use_lkg_head_baked ) @@ -7354,12 +7715,20 @@ void LLVOAvatar::updateMeshTextures() mEyesLayerSet->setUpdatesEnabled( TRUE ); } + if (use_lkg_hair_baked) + { + mHairLayerSet->setUpdatesEnabled(TRUE); + } + if( use_lkg_skirt_baked ) { mSkirtLayerSet->setUpdatesEnabled( TRUE ); } } - + + // Turn on alpha masking correctly for yourself and other avatars on 1.22+ + //mSupportsAlphaLayers = mIsSelf || hair_baked; + // Baked textures should be requested from the sim this avatar is on. JC LLHost target_host = getObjectHost(); if (!target_host.isOk()) @@ -7368,7 +7737,7 @@ void LLVOAvatar::updateMeshTextures() } // Head - if( use_lkg_head_baked ) + if (use_lkg_head_baked && !self_customize) { LLViewerImage* baked = gImageList.getImageFromHost( mLastHeadBakedID, target_host ); mHeadMesh0.setTexture( baked ); @@ -7378,8 +7747,7 @@ void LLVOAvatar::updateMeshTextures() mHeadMesh4.setTexture( baked ); mEyeLashMesh0.setTexture( baked ); } - else - if( !self_customize && head_baked ) + else if( !self_customize && head_baked ) { LLViewerImage* baked = getTEImage( TEX_HEAD_BAKED ); if( baked->getID() == mLastHeadBakedID ) @@ -7391,12 +7759,14 @@ void LLVOAvatar::updateMeshTextures() { mHeadBakedLoaded = FALSE; mHeadMaskDiscard = -1; - baked->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID )); + if (baked->getID() != IMG_INVISIBLE) + { + baked->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData(mID)); + } baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID( mID ) ); } } - else - if( mHeadLayerSet && !other_culled ) + else if( mHeadLayerSet && !other_culled ) { mHeadLayerSet->createComposite(); mHeadLayerSet->setUpdatesEnabled( TRUE ); @@ -7418,7 +7788,7 @@ void LLVOAvatar::updateMeshTextures() } // Upper body - if( use_lkg_upper_baked ) + if (use_lkg_upper_baked && !self_customize) { LLViewerImage* baked = gImageList.getImageFromHost( mLastUpperBodyBakedID, target_host ); mUpperBodyMesh0.setTexture( baked ); @@ -7427,8 +7797,7 @@ void LLVOAvatar::updateMeshTextures() mUpperBodyMesh3.setTexture( baked ); mUpperBodyMesh4.setTexture( baked ); } - else - if( !self_customize && upper_baked ) + else if( !self_customize && upper_baked ) { LLViewerImage* baked = getTEImage( TEX_UPPER_BAKED ); @@ -7441,12 +7810,14 @@ void LLVOAvatar::updateMeshTextures() { mUpperBakedLoaded = FALSE; mUpperMaskDiscard = -1; - baked->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID )); + if (baked->getID() != IMG_INVISIBLE) + { + baked->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData(mID)); + } baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID( mID ) ); } } - else - if( mUpperBodyLayerSet && !other_culled ) + else if( mUpperBodyLayerSet && !other_culled ) { mUpperBodyLayerSet->createComposite(); mUpperBodyLayerSet->setUpdatesEnabled( TRUE ); @@ -7466,7 +7837,7 @@ void LLVOAvatar::updateMeshTextures() } // Lower body - if( use_lkg_lower_baked ) + if (use_lkg_lower_baked && !self_customize) { LLViewerImage* baked = gImageList.getImageFromHost( mLastLowerBodyBakedID, target_host ); mLowerBodyMesh0.setTexture( baked ); @@ -7475,8 +7846,7 @@ void LLVOAvatar::updateMeshTextures() mLowerBodyMesh3.setTexture( baked ); mLowerBodyMesh4.setTexture( baked ); } - else - if( !self_customize && lower_baked ) + else if( !self_customize && lower_baked ) { LLViewerImage* baked = getTEImage( TEX_LOWER_BAKED ); if( baked->getID() == mLastLowerBodyBakedID ) @@ -7488,12 +7858,14 @@ void LLVOAvatar::updateMeshTextures() { mLowerBakedLoaded = FALSE; mLowerMaskDiscard = -1; - baked->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID )); + if (baked->getID() != IMG_INVISIBLE) + { + baked->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID )); + } baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID( mID ) ); } } - else - if( mLowerBodyLayerSet && !other_culled ) + else if( mLowerBodyLayerSet && !other_culled ) { mLowerBodyLayerSet->createComposite(); mLowerBodyLayerSet->setUpdatesEnabled( TRUE ); @@ -7513,7 +7885,7 @@ void LLVOAvatar::updateMeshTextures() } // Eyes - if( use_lkg_eyes_baked ) + if (use_lkg_eyes_baked && !self_customize) { LLViewerImage* baked = gImageList.getImageFromHost( mLastEyesBakedID, target_host ); mEyeBallLeftMesh0.setTexture( baked ); @@ -7521,8 +7893,7 @@ void LLVOAvatar::updateMeshTextures() mEyeBallRightMesh0.setTexture( baked ); mEyeBallRightMesh1.setTexture( baked ); } - else - if( !self_customize && eyes_baked ) + else if( !self_customize && eyes_baked ) { LLViewerImage* baked = getTEImage( TEX_EYES_BAKED ); if( baked->getID() == mLastEyesBakedID ) @@ -7536,8 +7907,7 @@ void LLVOAvatar::updateMeshTextures() baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID( mID ) ); } } - else - if( mEyesLayerSet && !other_culled ) + else if( mEyesLayerSet && !other_culled ) { mEyesLayerSet->createComposite(); mEyesLayerSet->setUpdatesEnabled( TRUE ); @@ -7555,7 +7925,7 @@ void LLVOAvatar::updateMeshTextures() } // Skirt - if( use_lkg_skirt_baked ) + if (use_lkg_skirt_baked && !self_customize) { LLViewerImage* baked = gImageList.getImageFromHost( mLastSkirtBakedID, target_host ); mSkirtMesh0.setTexture( baked ); @@ -7564,8 +7934,7 @@ void LLVOAvatar::updateMeshTextures() mSkirtMesh3.setTexture( baked ); mSkirtMesh4.setTexture( baked ); } - else - if( !self_customize && skirt_baked ) + else if( !self_customize && skirt_baked ) { LLViewerImage* baked = getTEImage( TEX_SKIRT_BAKED ); if( baked->getID() == mLastSkirtBakedID ) @@ -7579,8 +7948,7 @@ void LLVOAvatar::updateMeshTextures() baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID( mID ) ); } } - else - if( mSkirtLayerSet && !other_culled) + else if( mSkirtLayerSet && !other_culled) { mSkirtLayerSet->createComposite(); mSkirtLayerSet->setUpdatesEnabled( TRUE ); @@ -7599,16 +7967,58 @@ void LLVOAvatar::updateMeshTextures() mSkirtMesh4.setTexture( default_tex ); } - mHairMesh0.setTexture( getTEImage( TEX_HAIR ) ); - mHairMesh1.setTexture( getTEImage( TEX_HAIR ) ); - mHairMesh2.setTexture( getTEImage( TEX_HAIR ) ); - mHairMesh3.setTexture( getTEImage( TEX_HAIR ) ); - mHairMesh4.setTexture( getTEImage( TEX_HAIR ) ); - mHairMesh5.setTexture( getTEImage( TEX_HAIR ) ); + // Hair + if (use_lkg_hair_baked && !self_customize) + { + LLViewerImage* baked = gImageList.getImageFromHost(mLastHairBakedID, target_host); + mHairMesh0.setTexture(baked); + mHairMesh1.setTexture(baked); + mHairMesh2.setTexture(baked); + mHairMesh3.setTexture(baked); + mHairMesh4.setTexture(baked); + mHairMesh5.setTexture(baked); + } + else if (!self_customize && hair_baked) + { + LLViewerImage* baked = getTEImage(TEX_HAIR_BAKED); + if (baked->getID() == mLastHairBakedID) + { + // Even though the file may not be finished loading, we'll consider it loaded and use it (rather than doing compositing). + useBakedTexture(baked->getID()); + } + else + { + mHairBakedLoaded = FALSE; + baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID(mID)); + } + } + else if (mHairLayerSet && !other_culled + && (hair_baked || mIsSelf)) // ! BACKWARDS COMPATIBILITY ! workaround for old viewers. + { + mHairLayerSet->createComposite(); + mHairLayerSet->setUpdatesEnabled(TRUE); + mHairMesh0.setLayerSet(mHairLayerSet); + mHairMesh1.setLayerSet(mHairLayerSet); + mHairMesh2.setLayerSet(mHairLayerSet); + mHairMesh3.setLayerSet(mHairLayerSet); + mHairMesh4.setLayerSet(mHairLayerSet); + mHairMesh5.setLayerSet(mHairLayerSet); + } + else + { + mHairMesh0.setTexture(getTEImage(TEX_HAIR)); + mHairMesh1.setTexture(getTEImage(TEX_HAIR)); + mHairMesh2.setTexture(getTEImage(TEX_HAIR)); + mHairMesh3.setTexture(getTEImage(TEX_HAIR)); + mHairMesh4.setTexture(getTEImage(TEX_HAIR)); + mHairMesh5.setTexture(getTEImage(TEX_HAIR)); + } - if( mTexHairColor ) + // ! BACKWARDS COMPATIBILITY ! + // Workaround for viewing avatars from old viewers that haven't baked hair textures. + if (!mHasBakedHair) { - LLColor4 color = mTexHairColor->getColor(); + LLColor4 color = mTexHairColor ? mTexHairColor->getColor() : LLColor4(1, 1, 1, 1); mHairMesh0.setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] ); mHairMesh1.setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] ); mHairMesh2.setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] ); @@ -7620,6 +8030,8 @@ void LLVOAvatar::updateMeshTextures() // Head BOOL head_baked_ready = (head_baked && mHeadBakedLoaded) || other_culled; setLocalTexture( LOCTEX_HEAD_BODYPAINT, getTEImage( TEX_HEAD_BODYPAINT ), head_baked_ready ); + setLocalTexture( LOCTEX_HEAD_ALPHA, getTEImage( TEX_HEAD_ALPHA ), head_baked_ready ); + setLocalTexture( LOCTEX_HEAD_TATTOO, getTEImage( TEX_HEAD_TATTOO ), head_baked_ready ); // Upper body BOOL upper_baked_ready = (upper_baked && mUpperBakedLoaded) || other_culled; @@ -7628,6 +8040,8 @@ void LLVOAvatar::updateMeshTextures() setLocalTexture( LOCTEX_UPPER_JACKET, getTEImage( TEX_UPPER_JACKET ), upper_baked_ready ); setLocalTexture( LOCTEX_UPPER_GLOVES, getTEImage( TEX_UPPER_GLOVES ), upper_baked_ready ); setLocalTexture( LOCTEX_UPPER_UNDERSHIRT, getTEImage( TEX_UPPER_UNDERSHIRT ), upper_baked_ready ); + setLocalTexture( LOCTEX_UPPER_ALPHA, getTEImage( TEX_UPPER_ALPHA ), upper_baked_ready ); + setLocalTexture( LOCTEX_UPPER_TATTOO, getTEImage( TEX_UPPER_TATTOO ), upper_baked_ready ); // Lower body BOOL lower_baked_ready = (lower_baked && mLowerBakedLoaded) || other_culled; @@ -7637,10 +8051,18 @@ void LLVOAvatar::updateMeshTextures() setLocalTexture( LOCTEX_LOWER_SOCKS, getTEImage( TEX_LOWER_SOCKS ), lower_baked_ready ); setLocalTexture( LOCTEX_LOWER_JACKET, getTEImage( TEX_LOWER_JACKET ), lower_baked_ready ); setLocalTexture( LOCTEX_LOWER_UNDERPANTS, getTEImage( TEX_LOWER_UNDERPANTS ), lower_baked_ready ); + setLocalTexture( LOCTEX_LOWER_ALPHA, getTEImage( TEX_LOWER_ALPHA ), lower_baked_ready ); + setLocalTexture( LOCTEX_LOWER_TATTOO, getTEImage( TEX_LOWER_TATTOO ), lower_baked_ready ); // Eyes BOOL eyes_baked_ready = (eyes_baked && mEyesBakedLoaded) || other_culled; setLocalTexture( LOCTEX_EYES_IRIS, getTEImage( TEX_EYES_IRIS ), eyes_baked_ready ); + setLocalTexture( LOCTEX_EYES_ALPHA, getTEImage( TEX_EYES_ALPHA ), eyes_baked_ready ); + + // Hair + BOOL hair_baked_ready = (hair_baked && mHairBakedLoaded) || other_culled; + setLocalTexture( LOCTEX_HAIR, getTEImage( TEX_HAIR ), hair_baked_ready ); + setLocalTexture( LOCTEX_HAIR_ALPHA, getTEImage( TEX_HAIR_ALPHA ), hair_baked_ready ); // Skirt BOOL skirt_baked_ready = (skirt_baked && mSkirtBakedLoaded) || other_culled; @@ -7696,6 +8118,7 @@ void LLVOAvatar::requestLayerSetUploads() BOOL lower_baked = (getTEImage( TEX_LOWER_BAKED )->getID() != IMG_DEFAULT_AVATAR ); BOOL head_baked = (getTEImage( TEX_HEAD_BAKED )->getID() != IMG_DEFAULT_AVATAR ); BOOL eyes_baked = (getTEImage( TEX_EYES_BAKED )->getID() != IMG_DEFAULT_AVATAR ); + BOOL hair_baked = (getTEImage( TEX_HAIR_BAKED )->getID() != IMG_DEFAULT_AVATAR ); BOOL skirt_baked = (getTEImage( TEX_SKIRT_BAKED )->getID() != IMG_DEFAULT_AVATAR ); if( !head_baked && mHeadLayerSet ) @@ -7718,6 +8141,11 @@ void LLVOAvatar::requestLayerSetUploads() mEyesLayerSet->requestUpload(); } + if (!hair_baked && mHairLayerSet) + { + mHairLayerSet->requestUpload(); + } + if( !skirt_baked && mSkirtLayerSet ) { mSkirtLayerSet->requestUpload(); @@ -7750,6 +8178,11 @@ void LLVOAvatar::setCompositeUpdatesEnabled( BOOL b ) mEyesLayerSet->setUpdatesEnabled( b ); } + if (mHairLayerSet) + { + mHairLayerSet->setUpdatesEnabled( b ); + } + if( mSkirtLayerSet ) { mSkirtLayerSet->setUpdatesEnabled( b ); @@ -7804,14 +8237,16 @@ S32 LLVOAvatar::getLocalDiscardLevel( S32 index ) //----------------------------------------------------------------------------- // isLocalTextureDataFinal() -// Returns true is the highest quality discard level exists for every texture +// Returns true if the highest quality discard level exists for every texture // in the layerset. //----------------------------------------------------------------------------- BOOL LLVOAvatar::isLocalTextureDataFinal( LLTexLayerSet* layerset ) { if( layerset == mHeadLayerSet ) { - return getLocalDiscardLevel( LOCTEX_HEAD_BODYPAINT ) == 0; + return getLocalDiscardLevel(LOCTEX_HEAD_BODYPAINT) == 0 && + getLocalDiscardLevel(LOCTEX_HEAD_ALPHA) == 0 && + getLocalDiscardLevel(LOCTEX_HEAD_TATTOO) == 0; } else if( layerset == mUpperBodyLayerSet ) { @@ -7819,7 +8254,9 @@ BOOL LLVOAvatar::isLocalTextureDataFinal( LLTexLayerSet* layerset ) getLocalDiscardLevel( LOCTEX_UPPER_BODYPAINT ) == 0 && getLocalDiscardLevel( LOCTEX_UPPER_JACKET ) == 0 && getLocalDiscardLevel( LOCTEX_UPPER_GLOVES ) == 0 && - getLocalDiscardLevel( LOCTEX_UPPER_UNDERSHIRT ) == 0; + getLocalDiscardLevel( LOCTEX_UPPER_UNDERSHIRT ) == 0 && + getLocalDiscardLevel( LOCTEX_UPPER_ALPHA ) == 0 && + getLocalDiscardLevel( LOCTEX_UPPER_TATTOO ) == 0; } else if( layerset == mLowerBodyLayerSet ) { @@ -7828,11 +8265,19 @@ BOOL LLVOAvatar::isLocalTextureDataFinal( LLTexLayerSet* layerset ) getLocalDiscardLevel( LOCTEX_LOWER_SHOES ) == 0 && getLocalDiscardLevel( LOCTEX_LOWER_SOCKS ) == 0 && getLocalDiscardLevel( LOCTEX_LOWER_JACKET ) == 0 && - getLocalDiscardLevel( LOCTEX_LOWER_UNDERPANTS ) == 0; + getLocalDiscardLevel( LOCTEX_LOWER_UNDERPANTS ) == 0 && + getLocalDiscardLevel( LOCTEX_LOWER_ALPHA ) == 0 && + getLocalDiscardLevel( LOCTEX_LOWER_TATTOO ) == 0; } else if( layerset == mEyesLayerSet ) { - return getLocalDiscardLevel( LOCTEX_EYES_IRIS ) == 0; + return getLocalDiscardLevel(LOCTEX_EYES_IRIS) == 0 && + getLocalDiscardLevel(LOCTEX_EYES_ALPHA) == 0; + } + else if (layerset == mHairLayerSet) + { + return getLocalDiscardLevel(LOCTEX_HAIR) == 0 && + getLocalDiscardLevel(LOCTEX_HAIR_ALPHA) == 0; } else if( layerset == mSkirtLayerSet ) { @@ -7845,14 +8290,15 @@ BOOL LLVOAvatar::isLocalTextureDataFinal( LLTexLayerSet* layerset ) //----------------------------------------------------------------------------- // isLocalTextureDataAvailable() -// Returns true is at least the lowest quality discard level exists for every texture +// Returns true if at least the lowest quality discard level exists for every texture // in the layerset. //----------------------------------------------------------------------------- BOOL LLVOAvatar::isLocalTextureDataAvailable( LLTexLayerSet* layerset ) { if( layerset == mHeadLayerSet ) { - return getLocalDiscardLevel( LOCTEX_HEAD_BODYPAINT ) >= 0; + return getLocalDiscardLevel(LOCTEX_HEAD_BODYPAINT) >= 0 && + getLocalDiscardLevel(LOCTEX_HEAD_ALPHA) >= 0; } else if( layerset == mUpperBodyLayerSet ) { @@ -7860,7 +8306,9 @@ BOOL LLVOAvatar::isLocalTextureDataAvailable( LLTexLayerSet* layerset ) getLocalDiscardLevel( LOCTEX_UPPER_BODYPAINT ) >= 0 && getLocalDiscardLevel( LOCTEX_UPPER_JACKET ) >= 0 && getLocalDiscardLevel( LOCTEX_UPPER_GLOVES ) >= 0 && - getLocalDiscardLevel( LOCTEX_UPPER_UNDERSHIRT ) >= 0; + getLocalDiscardLevel( LOCTEX_UPPER_UNDERSHIRT ) >= 0 && + getLocalDiscardLevel( LOCTEX_UPPER_ALPHA ) >= 0 && + getLocalDiscardLevel( LOCTEX_UPPER_TATTOO ) >= 0; } else if( layerset == mLowerBodyLayerSet ) { @@ -7869,11 +8317,19 @@ BOOL LLVOAvatar::isLocalTextureDataAvailable( LLTexLayerSet* layerset ) getLocalDiscardLevel( LOCTEX_LOWER_SHOES ) >= 0 && getLocalDiscardLevel( LOCTEX_LOWER_SOCKS ) >= 0 && getLocalDiscardLevel( LOCTEX_LOWER_JACKET ) >= 0 && - getLocalDiscardLevel( LOCTEX_LOWER_UNDERPANTS ) >= 0; + getLocalDiscardLevel( LOCTEX_LOWER_UNDERPANTS ) >= 0 && + getLocalDiscardLevel( LOCTEX_LOWER_ALPHA ) >= 0 && + getLocalDiscardLevel( LOCTEX_LOWER_TATTOO ) >= 0; } else if( layerset == mEyesLayerSet ) { - return getLocalDiscardLevel( LOCTEX_EYES_IRIS ) >= 0; + return getLocalDiscardLevel(LOCTEX_EYES_IRIS) >= 0 && + getLocalDiscardLevel(LOCTEX_EYES_ALPHA) >= 0; + } + else if (layerset == mHairLayerSet) + { + return getLocalDiscardLevel(LOCTEX_HAIR) >= 0 && + getLocalDiscardLevel(LOCTEX_HAIR_ALPHA) >= 0; } else if( layerset == mSkirtLayerSet ) { @@ -7895,23 +8351,23 @@ LLVOAvatar::ETextureIndex LLVOAvatar::getBakedTE( LLTexLayerSet* layerset ) { return TEX_HEAD_BAKED; } - else - if( layerset == mUpperBodyLayerSet ) + else if( layerset == mUpperBodyLayerSet ) { return TEX_UPPER_BAKED; } - else - if( layerset == mLowerBodyLayerSet ) + else if( layerset == mLowerBodyLayerSet ) { return TEX_LOWER_BAKED; } - else - if( layerset == mEyesLayerSet ) + else if( layerset == mEyesLayerSet ) { return TEX_EYES_BAKED; } - else - if( layerset == mSkirtLayerSet ) + else if (layerset == mHairLayerSet) + { + return TEX_HAIR_BAKED; + } + else if( layerset == mSkirtLayerSet ) { return TEX_SKIRT_BAKED; } @@ -7929,7 +8385,13 @@ void LLVOAvatar::setNewBakedTexture( ETextureIndex te, const LLUUID& uuid ) // Baked textures live on other sims. LLHost target_host = getObjectHost(); setTEImage( te, gImageList.getImageFromHost( uuid, target_host ) ); - updateMeshTextures(); + if (uuid != IMG_INVISIBLE) + { + // Do not update textures when setting a new invisible baked texture as + // it would result in destroying the calling object (setNewBakedTexture() + // is called by LLTexLayerSetBuffer::render()) ! + updateMeshTextures(); + } dirtyMesh(); LLVOAvatar::cullAvatarsByPixelArea(); @@ -7948,6 +8410,9 @@ void LLVOAvatar::setNewBakedTexture( ETextureIndex te, const LLUUID& uuid ) case TEX_EYES_BAKED: llinfos << "New baked texture: EYES" << llendl; break; + case TEX_HAIR_BAKED: + llinfos << "New baked texture: HAIR" << llendl; + break; case TEX_SKIRT_BAKED: llinfos << "New baked texture: SKIRT" << llendl; break; @@ -7970,6 +8435,7 @@ bool LLVOAvatar::hasPendingBakedUploads() bool upper_pending = (mUpperBodyLayerSet && mUpperBodyLayerSet->getComposite()->uploadPending()); bool lower_pending = (mLowerBodyLayerSet && mLowerBodyLayerSet->getComposite()->uploadPending()); bool eyes_pending = (mEyesLayerSet && mEyesLayerSet->getComposite()->uploadPending()); + bool hair_pending = (mHairLayerSet && mHairLayerSet->getComposite()->uploadPending()); bool skirt_pending = (mSkirtLayerSet && mSkirtLayerSet->getComposite()->uploadPending()); //llinfos << "TAT: LLVOAvatar::hasPendingBakedUploads()" @@ -7977,17 +8443,11 @@ bool LLVOAvatar::hasPendingBakedUploads() // << " upper_pending " << upper_pending // << " lower_pending " << lower_pending // << " eyes_pending " << eyes_pending + // << " hair_pending " << hair_pending // << " skirt_pending " << skirt_pending // << llendl; - if (head_pending || upper_pending || lower_pending || eyes_pending || skirt_pending) - { - return true; - } - else - { - return false; - } + return head_pending || upper_pending || lower_pending || eyes_pending || hair_pending || skirt_pending; } //----------------------------------------------------------------------------- @@ -8024,30 +8484,20 @@ void LLVOAvatar::setCachedBakedTexture( ETextureIndex te, const LLUUID& uuid ) mEyesLayerSet->cancelUpload(); } break; + case TEX_HAIR_BAKED: + if (mHairLayerSet) + { + mHairLayerSet->cancelUpload(); + } + break; case TEX_SKIRT_BAKED: if( mSkirtLayerSet ) { mSkirtLayerSet->cancelUpload(); } break; - - case TEX_HEAD_BODYPAINT: - case TEX_UPPER_SHIRT: - case TEX_LOWER_PANTS: - case TEX_EYES_IRIS: - case TEX_HAIR: - case TEX_UPPER_BODYPAINT: - case TEX_LOWER_BODYPAINT: - case TEX_LOWER_SHOES: - case TEX_LOWER_SOCKS: - case TEX_UPPER_JACKET: - case TEX_LOWER_JACKET: - case TEX_UPPER_GLOVES: - case TEX_UPPER_UNDERSHIRT: - case TEX_LOWER_UNDERPANTS: - case TEX_SKIRT: - case TEX_NUM_ENTRIES: - break; + default: + break; } } @@ -8104,6 +8554,7 @@ void LLVOAvatar::onCustomizeEnd() gAgent.sendAgentSetAppearance(); } + BOOL LLVOAvatar::teToColorParams( ETextureIndex te, const char* param_name[3] ) { switch( te ) @@ -8223,7 +8674,16 @@ void LLVOAvatar::dumpAvatarTEs( const std::string& context ) "TEX_UPPER_UNDERSHIRT ", "TEX_LOWER_UNDERPANTS ", "TEX_SKIRT ", - "TEX_SKIRT_BAKED " + "TEX_SKIRT_BAKED ", + "TEX_HAIR_BAKED ", + "TEX_LOWER_ALPHA ", + "TEX_UPPER_ALPHA ", + "TEX_HEAD_ALPHA ", + "TEX_EYES_ALPHA ", + "TEX_HAIR_ALPHA ", + "TEX_HEAD_TATTOO ", + "TEX_UPPER_TATTOO ", + "TEX_LOWER_TATTOO " }; LLViewerImage* te_image = getTEImage(i); @@ -8242,6 +8702,11 @@ void LLVOAvatar::dumpAvatarTEs( const std::string& context ) llinfos << " " << te_name[i] << ": IMG_DEFAULT" << llendl; } else + if (te_image->getID() == IMG_INVISIBLE) + { + llinfos << " " << te_name[i] << ": IMG_INVISIBLE" << llendl; + } + else if( te_image->getID() == IMG_DEFAULT_AVATAR ) { llinfos << " " << te_name[i] << ": IMG_DEFAULT_AVATAR" << llendl; @@ -8311,6 +8776,16 @@ LLUUID LLVOAvatar::getDefaultTEImageID( S32 te ) case TEX_SKIRT: return LLUUID( gSavedSettings.getString("UIImgDefaultSkirtUUID") ); + case TEX_LOWER_ALPHA: + case TEX_UPPER_ALPHA: + case TEX_HEAD_ALPHA: + case TEX_EYES_ALPHA: + case TEX_HAIR_ALPHA: return LLUUID(gSavedSettings.getString("UIImgDefaultAlphaUUID")); + + case TEX_LOWER_TATTOO: + case TEX_UPPER_TATTOO: + case TEX_HEAD_TATTOO: return LLUUID(gSavedSettings.getString("UIImgDefaultTattooUUID")); + default: return IMG_DEFAULT_AVATAR; } } @@ -8362,6 +8837,18 @@ EWearableType LLVOAvatar::getTEWearableType( S32 te ) case TEX_SKIRT: return WT_SKIRT; + case TEX_HEAD_ALPHA: + case TEX_UPPER_ALPHA: + case TEX_LOWER_ALPHA: + case TEX_EYES_ALPHA: + case TEX_HAIR_ALPHA: + return WT_ALPHA; + + case TEX_HEAD_TATTOO: + case TEX_UPPER_TATTOO: + case TEX_LOWER_TATTOO: + return WT_TATTOO; + default: return WT_INVALID; } @@ -8412,6 +8899,14 @@ BOOL LLVOAvatar::isWearingWearableType( EWearableType type ) indicator_te = TEX_SKIRT; break; + case WT_ALPHA: + indicator_te = TEX_LOWER_ALPHA; + break; + + case WT_TATTOO: + indicator_te = TEX_HEAD_TATTOO; + break; + case WT_SHAPE: case WT_SKIN: case WT_HAIR: @@ -8508,6 +9003,7 @@ void LLVOAvatar::onFirstTEMessageReceived() BOOL upper_baked = ( getTEImage( TEX_UPPER_BAKED )->getID() != IMG_DEFAULT_AVATAR ); BOOL lower_baked = ( getTEImage( TEX_LOWER_BAKED )->getID() != IMG_DEFAULT_AVATAR ); BOOL eyes_baked = ( getTEImage( TEX_EYES_BAKED )->getID() != IMG_DEFAULT_AVATAR ); + BOOL hair_baked = ( getTEImage( TEX_HAIR_BAKED )->getID() != IMG_DEFAULT_AVATAR ); BOOL skirt_baked = ( getTEImage( TEX_SKIRT_BAKED )->getID() != IMG_DEFAULT_AVATAR ); // Use any baked textures that we have even if they haven't downloaded yet. @@ -8516,7 +9012,10 @@ void LLVOAvatar::onFirstTEMessageReceived() { mLastHeadBakedID = getTEImage( TEX_HEAD_BAKED )->getID(); LLViewerImage* image = getTEImage( TEX_HEAD_BAKED ); - image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID )); + if (image->getID() != IMG_INVISIBLE) + { + image->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData(mID)); + } image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, FALSE, new LLUUID( mID ) ); } @@ -8524,7 +9023,10 @@ void LLVOAvatar::onFirstTEMessageReceived() { mLastUpperBodyBakedID = getTEImage( TEX_UPPER_BAKED )->getID(); LLViewerImage* image = getTEImage( TEX_UPPER_BAKED ); - image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID )); + if (image->getID() != IMG_INVISIBLE) + { + image->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData(mID)); + } image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, FALSE, new LLUUID( mID ) ); } @@ -8532,7 +9034,10 @@ void LLVOAvatar::onFirstTEMessageReceived() { mLastLowerBodyBakedID = getTEImage( TEX_LOWER_BAKED )->getID(); LLViewerImage* image = getTEImage( TEX_LOWER_BAKED ); - image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID )); + if (image->getID() != IMG_INVISIBLE) + { + image->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData(mID)); + } image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, FALSE, new LLUUID( mID ) ); } @@ -8543,6 +9048,13 @@ void LLVOAvatar::onFirstTEMessageReceived() image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, FALSE, new LLUUID( mID ) ); } + if ( hair_baked ) + { + mLastHairBakedID = getTEImage( TEX_HAIR_BAKED )->getID(); + LLViewerImage* image = getTEImage( TEX_HAIR_BAKED ); + image->setLoadedCallback(onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, FALSE, new LLUUID(mID)); + } + if( skirt_baked ) { mLastSkirtBakedID = getTEImage( TEX_SKIRT_BAKED )->getID(); @@ -8594,11 +9106,39 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) unpackTEMessage(mesgsys, _PREHASH_ObjectData); // dumpAvatarTEs( "POST processAvatarAppearance()" ); + // prevent the overwriting of valid baked textures with invalid baked textures + if (getTEImage(TEX_HEAD_BAKED)->getID() == IMG_DEFAULT_AVATAR && + mLastHeadBakedID != IMG_DEFAULT) + { + setTEImage(TEX_HEAD_BAKED, gImageList.getImage(mLastHeadBakedID)); + } + if (getTEImage(TEX_UPPER_BAKED)->getID() == IMG_DEFAULT_AVATAR && + mLastUpperBodyBakedID != IMG_DEFAULT) + { + setTEImage(TEX_UPPER_BAKED, gImageList.getImage(mLastUpperBodyBakedID)); + } + if (getTEImage(TEX_LOWER_BAKED)->getID() == IMG_DEFAULT_AVATAR && + mLastLowerBodyBakedID != IMG_DEFAULT) + { + setTEImage(TEX_LOWER_BAKED, gImageList.getImage(mLastLowerBodyBakedID)); + } + if (getTEImage(TEX_EYES_BAKED)->getID() == IMG_DEFAULT_AVATAR && + mLastEyesBakedID != IMG_DEFAULT) + { + setTEImage(TEX_EYES_BAKED, gImageList.getImage(mLastEyesBakedID)); + } + if (getTEImage(TEX_HAIR_BAKED)->getID() == IMG_DEFAULT_AVATAR && + mLastHairBakedID != IMG_DEFAULT) + { + setTEImage(TEX_HAIR_BAKED, gImageList.getImage(mLastHairBakedID)); + } + // llinfos << "Received AvatarAppearance: " << (mIsSelf ? "(self): " : "(other): " ) << // (( getTEImage( TEX_HEAD_BAKED )->getID() != IMG_DEFAULT_AVATAR ) ? "HEAD " : "head " ) << // (( getTEImage( TEX_UPPER_BAKED )->getID() != IMG_DEFAULT_AVATAR ) ? "UPPER " : "upper " ) << // (( getTEImage( TEX_LOWER_BAKED )->getID() != IMG_DEFAULT_AVATAR ) ? "LOWER " : "lower " ) << -// (( getTEImage( TEX_EYES_BAKED )->getID() != IMG_DEFAULT_AVATAR ) ? "EYES" : "eyes" ) << llendl; +// (( getTEImage( TEX_EYES_BAKED )->getID() != IMG_DEFAULT_AVATAR ) ? "EYES" : "eyes" ) << +// (( getTEImage( TEX_HAIR_BAKED )->getID() != IMG_DEFAULT_AVATAR ) ? "HAIR" : "hair" ) << llendl; if( !mFirstTEMessageReceived ) { @@ -8639,6 +9179,22 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) mesgsys->getU8Fast(_PREHASH_VisualParam, _PREHASH_ParamValue, value, i); F32 newWeight = U8_to_F32(value, param->getMinWeight(), param->getMaxWeight()); + if(param->getID() == 507 && newWeight != getActualBoobGrav()) + { + llwarns << "Boob Grav SET to " << newWeight << " for " << getFullname() << llendl; + setActualBoobGrav(newWeight); + } + if(param->getID() == 795 && newWeight != getActualButtGrav()) + { + llwarns << "Butt Grav SET to " << newWeight << " for " << getFullname() << llendl; + setActualButtGrav(newWeight); + } + if(param->getID() == 157 && newWeight != getActualFatGrav()) + { + llwarns << "Fat Grav SET to " << newWeight << " for " << getFullname() << llendl; + setActualFatGrav(newWeight); + } + if (is_first_appearance_message || (param->getWeight() != newWeight)) { //llinfos << "Received update for param " << param->getDisplayName() << " at value " << newWeight << llendl; @@ -8727,15 +9283,13 @@ void LLVOAvatar::getAnimNames( LLDynamicArray* names ) void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerImage *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ) { + if (!userdata) return; + //llinfos << "onBakedTextureMasksLoaded: " << src_vi->getID() << llendl; LLMemType mt(LLMemType::MTYPE_AVATAR); LLUUID id = src_vi->getID(); - if (!userdata) - { - return; - } LLTextureMaskData* maskData = (LLTextureMaskData*) userdata; LLVOAvatar* self = (LLVOAvatar*) gObjectList.findObject( maskData->mAvatarID ); @@ -8791,8 +9345,7 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerImage *src_vi, llwarns << "onBakedTextureMasksLoaded: no mHeadLayerSet." << llendl; } } - else - if( id == upper_baked->getID() ) + else if( id == upper_baked->getID() ) { if ( self->mUpperBodyLayerSet) { @@ -8811,8 +9364,7 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerImage *src_vi, llwarns << "onBakedTextureMasksLoaded: no mHeadLayerSet." << llendl; } } - else - if( id == lower_baked->getID() ) + else if( id == lower_baked->getID() ) { if ( self->mLowerBodyLayerSet ) { @@ -8850,7 +9402,6 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerImage *src_vi, { delete maskData; } - } // static @@ -8902,6 +9453,7 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id ) LLViewerImage* upper_baked = getTEImage( TEX_UPPER_BAKED ); LLViewerImage* lower_baked = getTEImage( TEX_LOWER_BAKED ); LLViewerImage* eyes_baked = getTEImage( TEX_EYES_BAKED ); + LLViewerImage* hair_baked = getTEImage( TEX_HAIR_BAKED ); LLViewerImage* skirt_baked = getTEImage( TEX_SKIRT_BAKED ); if( id == head_baked->getID() ) @@ -8920,9 +9472,10 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id ) mHeadLayerSet->destroyComposite(); } setLocalTexture( LOCTEX_HEAD_BODYPAINT, getTEImage( TEX_HEAD_BODYPAINT ), TRUE ); + setLocalTexture( LOCTEX_HEAD_ALPHA, getTEImage( TEX_HEAD_ALPHA ), TRUE ); + setLocalTexture( LOCTEX_HEAD_TATTOO, getTEImage( TEX_HEAD_TATTOO ), TRUE ); } - else - if( id == upper_baked->getID() ) + else if( id == upper_baked->getID() ) { mUpperBakedLoaded = TRUE; @@ -8942,9 +9495,10 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id ) setLocalTexture( LOCTEX_UPPER_JACKET, getTEImage( TEX_UPPER_JACKET ), TRUE ); setLocalTexture( LOCTEX_UPPER_GLOVES, getTEImage( TEX_UPPER_GLOVES ), TRUE ); setLocalTexture( LOCTEX_UPPER_UNDERSHIRT, getTEImage( TEX_UPPER_UNDERSHIRT ), TRUE ); + setLocalTexture( LOCTEX_UPPER_ALPHA, getTEImage( TEX_UPPER_ALPHA ), TRUE ); + setLocalTexture( LOCTEX_UPPER_TATTOO, getTEImage( TEX_UPPER_TATTOO ), TRUE ); } - else - if( id == lower_baked->getID() ) + else if( id == lower_baked->getID() ) { mLowerBakedLoaded = TRUE; @@ -8965,9 +9519,10 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id ) setLocalTexture( LOCTEX_LOWER_SOCKS, getTEImage( TEX_LOWER_SOCKS ), TRUE ); setLocalTexture( LOCTEX_LOWER_JACKET, getTEImage( TEX_LOWER_JACKET ), TRUE ); setLocalTexture( LOCTEX_LOWER_UNDERPANTS, getTEImage( TEX_LOWER_UNDERPANTS ), TRUE ); + setLocalTexture( LOCTEX_LOWER_ALPHA, getTEImage( TEX_LOWER_ALPHA ), TRUE ); + setLocalTexture( LOCTEX_LOWER_TATTOO, getTEImage( TEX_LOWER_TATTOO ), TRUE ); } - else - if( id == eyes_baked->getID() ) + else if( id == eyes_baked->getID() ) { mEyesBakedLoaded = TRUE; @@ -8982,9 +9537,41 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id ) } setLocalTexture( LOCTEX_EYES_IRIS, getTEImage( TEX_EYES_IRIS ), TRUE ); + setLocalTexture(LOCTEX_EYES_ALPHA, getTEImage(TEX_EYES_ALPHA), TRUE); } - else - if( id == skirt_baked->getID() ) + else if (id == hair_baked->getID()) + { + mHairBakedLoaded = TRUE; + + mLastHairBakedID = id; + mHairMesh0.setTexture(hair_baked); + mHairMesh1.setTexture(hair_baked); + mHairMesh2.setTexture(hair_baked); + mHairMesh3.setTexture(hair_baked); + mHairMesh4.setTexture(hair_baked); + mHairMesh5.setTexture(hair_baked); + if (mHairLayerSet) + { + mHairLayerSet->destroyComposite(); + } + + setLocalTexture(LOCTEX_HAIR, getTEImage(TEX_HAIR), TRUE); + setLocalTexture(LOCTEX_HAIR_ALPHA, getTEImage(TEX_HAIR_ALPHA), TRUE); + + // ! BACKWARDS COMPATIBILITY ! + // Workaround for viewing avatars from old viewers that haven't baked hair textures. + // This is paired with similar code in updateMeshTextures that sets hair mesh color. + if (!mHasBakedHair) + { + mHairMesh0.setColor(1.f, 1.f, 1.f, 1.f); + mHairMesh1.setColor(1.f, 1.f, 1.f, 1.f); + mHairMesh2.setColor(1.f, 1.f, 1.f, 1.f); + mHairMesh3.setColor(1.f, 1.f, 1.f, 1.f); + mHairMesh4.setColor(1.f, 1.f, 1.f, 1.f); + mHairMesh5.setColor(1.f, 1.f, 1.f, 1.f); + } + } + else if( id == skirt_baked->getID() ) { mSkirtBakedLoaded = TRUE; @@ -9215,9 +9802,16 @@ BOOL LLVOAvatar::canGrabLocalTexture(ETextureIndex index) { case TEX_EYES_BAKED: textures.push_back(TEX_EYES_IRIS); + textures.push_back(TEX_EYES_ALPHA); + break; + case TEX_HAIR_BAKED: + textures.push_back(TEX_HAIR); + textures.push_back(TEX_HAIR_ALPHA); break; case TEX_HEAD_BAKED: textures.push_back(TEX_HEAD_BODYPAINT); + textures.push_back(TEX_HEAD_ALPHA); + textures.push_back(TEX_HEAD_TATTOO); break; case TEX_UPPER_BAKED: textures.push_back(TEX_UPPER_BODYPAINT); @@ -9225,6 +9819,8 @@ BOOL LLVOAvatar::canGrabLocalTexture(ETextureIndex index) textures.push_back(TEX_UPPER_SHIRT); textures.push_back(TEX_UPPER_JACKET); textures.push_back(TEX_UPPER_GLOVES); + textures.push_back(TEX_UPPER_ALPHA); + textures.push_back(TEX_UPPER_TATTOO); break; case TEX_LOWER_BAKED: textures.push_back(TEX_LOWER_BODYPAINT); @@ -9233,6 +9829,8 @@ BOOL LLVOAvatar::canGrabLocalTexture(ETextureIndex index) textures.push_back(TEX_LOWER_JACKET); textures.push_back(TEX_LOWER_SOCKS); textures.push_back(TEX_LOWER_SHOES); + textures.push_back(TEX_LOWER_ALPHA); + textures.push_back(TEX_LOWER_TATTOO); break; case TEX_SKIRT_BAKED: textures.push_back(TEX_SKIRT); @@ -9294,20 +9892,30 @@ void LLVOAvatar::dumpLocalTextures() llinfos << "Local Textures:" << llendl; const char* names[] = { - "Shirt ", - "UpperTatoo", - "Pants ", - "LowerTatoo", - "Head Tatoo", - "Shoes ", - "Socks ", - "Upper Jckt", - "Lower Jckt", - "Gloves ", - "Undershirt", - "Underpants", - "Iris ", - "Skirt "}; + "Shirt ", + "Upper Bodypaint", + "Pants ", + "Lower Bodypaint", + "Head Bodypaint ", + "Shoes ", + "Socks ", + "Upper Jacket ", + "Lower Jacket ", + "Gloves ", + "Undershirt ", + "Underpants ", + "Iris ", + "Skirt ", + "Hair ", + "Lower Alpha ", + "Upper Alpha ", + "Head Alpha ", + "Eyes Alpha ", + "Hair Alpha ", + "Head Tattoo ", + "Upper Tattoo ", + "Lower Tattoo " + }; ETextureIndex baked_equiv[] = { TEX_UPPER_BAKED, @@ -9323,7 +9931,17 @@ void LLVOAvatar::dumpLocalTextures() TEX_UPPER_BAKED, TEX_LOWER_BAKED, TEX_EYES_BAKED, - TEX_SKIRT_BAKED }; + TEX_SKIRT_BAKED, + TEX_HAIR_BAKED, + TEX_LOWER_BAKED, + TEX_UPPER_BAKED, + TEX_HEAD_BAKED, + TEX_EYES_BAKED, + TEX_HEAD_BAKED, + TEX_HAIR_BAKED, + TEX_UPPER_BAKED, + TEX_LOWER_BAKED + }; for( S32 i = 0; i < LOCTEX_NUM_ENTRIES; i++ ) @@ -9405,6 +10023,7 @@ void LLVOAvatar::removeMissingBakedTextures() invalidateComposite( mUpperBodyLayerSet, FALSE ); invalidateComposite( mLowerBodyLayerSet, FALSE ); invalidateComposite( mSkirtLayerSet, FALSE ); + invalidateComposite( mHairLayerSet, FALSE ); updateMeshTextures(); requestLayerSetUploads(); } @@ -9905,6 +10524,8 @@ LLTexLayerSet* LLVOAvatar::getLayerSet(ETextureIndex index) const { case TEX_HEAD_BAKED: case TEX_HEAD_BODYPAINT: + case TEX_HEAD_ALPHA: + case TEX_HEAD_TATTOO: return mHeadLayerSet; case TEX_UPPER_BAKED: @@ -9913,6 +10534,8 @@ LLTexLayerSet* LLVOAvatar::getLayerSet(ETextureIndex index) const case TEX_UPPER_JACKET: case TEX_UPPER_GLOVES: case TEX_UPPER_UNDERSHIRT: + case TEX_UPPER_ALPHA: + case TEX_UPPER_TATTOO: return mUpperBodyLayerSet; case TEX_LOWER_BAKED: @@ -9922,10 +10545,13 @@ LLTexLayerSet* LLVOAvatar::getLayerSet(ETextureIndex index) const case TEX_LOWER_SOCKS: case TEX_LOWER_JACKET: case TEX_LOWER_UNDERPANTS: + case TEX_LOWER_ALPHA: + case TEX_LOWER_TATTOO: return mLowerBodyLayerSet; case TEX_EYES_BAKED: case TEX_EYES_IRIS: + case TEX_EYES_ALPHA: return mEyesLayerSet; case TEX_SKIRT_BAKED: @@ -9933,6 +10559,10 @@ LLTexLayerSet* LLVOAvatar::getLayerSet(ETextureIndex index) const return mSkirtLayerSet; case TEX_HAIR: + case TEX_HAIR_BAKED: + case TEX_HAIR_ALPHA: + return mHairLayerSet; + default: return NULL; } diff --git a/linden/indra/newview/llvoavatar.h b/linden/indra/newview/llvoavatar.h index 9806ceb..60bceee 100644 --- a/linden/indra/newview/llvoavatar.h +++ b/linden/indra/newview/llvoavatar.h @@ -40,6 +40,8 @@ #include #include +#include "imageids.h" // IMG_INVISIBLE +#include "lldrawpoolalpha.h" #include "llchat.h" #include "llviewerobject.h" #include "lljointsolverrp3.h" @@ -55,6 +57,8 @@ #include "llwearable.h" #include "llrendertarget.h" +#include "emeraldboobutils.h" + //Ventrella //#include "llvoiceclient.h" #include "llvoicevisualizer.h" @@ -109,7 +113,7 @@ typedef enum e_render_name RENDER_NAME_ALWAYS } eRenderName; -const S32 BAKED_TEXTURE_COUNT = 5; // number of values in ETextureIndex that are pre-composited +const S32 BAKED_TEXTURE_COUNT = 6; // number of values in ETextureIndex that are pre-composited //------------------------------------------------------------------------ // LLVOAvatar Support classes @@ -290,6 +294,7 @@ class LLVOAvatar : void idleUpdateLipSync(bool voice_enabled); void idleUpdateLoadingEffect(); void idleUpdateWindEffect(); + void idleUpdateBoobEffect(); void idleUpdateNameTag(const LLVector3& root_pos_last); void idleUpdateRenderCost(); void idleUpdateTractorBeam(); @@ -305,7 +310,7 @@ class LLVOAvatar : U32 renderImpostor(LLColor4U color = LLColor4U(255,255,255,255)); U32 renderRigid(); U32 renderSkinned(EAvatarRenderPass pass); - U32 renderTransparent(); + U32 renderTransparent(BOOL first_pass); void renderCollisionVolumes(); /*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, @@ -380,9 +385,18 @@ class LLVOAvatar : TEX_LOWER_UNDERPANTS = 17, TEX_SKIRT = 18, TEX_SKIRT_BAKED = 19, // Pre-composited - TEX_NUM_ENTRIES = 20 + TEX_HAIR_BAKED = 20, // Pre-composited + TEX_LOWER_ALPHA = 21, + TEX_UPPER_ALPHA = 22, + TEX_HEAD_ALPHA = 23, + TEX_EYES_ALPHA = 24, + TEX_HAIR_ALPHA = 25, + TEX_HEAD_TATTOO = 26, + TEX_UPPER_TATTOO = 27, + TEX_LOWER_TATTOO = 28, + TEX_NUM_ENTRIES = 29 }; - // Note: if TEX_NUM_ENTRIES changes, update AGENT_TEXTURES in llagentinfo.h, mTextureIndexBaked, and BAKED_TEXTURE_COUNT + // Note: if TEX_NUM_ENTRIES changes, update AGENT_TEXTURES in BAKED_TEXTURE_COUNT static BOOL isTextureIndexBaked( S32 i ) { @@ -393,6 +407,7 @@ class LLVOAvatar : case TEX_LOWER_BAKED: case TEX_EYES_BAKED: case TEX_SKIRT_BAKED: + case TEX_HAIR_BAKED: return TRUE; default: return FALSE; @@ -456,6 +471,8 @@ class LLVOAvatar : void dumpLocalTextures(); const LLUUID& grabLocalTexture(ETextureIndex index); BOOL canGrabLocalTexture(ETextureIndex index); + BOOL isTextureDefined(U8 te) const; + BOOL isTextureVisible(U8 te) const; void startAppearanceAnimation(BOOL set_by_user, BOOL play_sound); void setCompositeUpdatesEnabled(BOOL b); @@ -548,7 +565,16 @@ class LLVOAvatar : LOCTEX_LOWER_UNDERPANTS = 11, LOCTEX_EYES_IRIS = 12, LOCTEX_SKIRT = 13, - LOCTEX_NUM_ENTRIES = 14 + LOCTEX_HAIR = 14, + LOCTEX_LOWER_ALPHA = 15, + LOCTEX_UPPER_ALPHA = 16, + LOCTEX_HEAD_ALPHA = 17, + LOCTEX_EYES_ALPHA = 18, + LOCTEX_HAIR_ALPHA = 19, + LOCTEX_HEAD_TATTOO = 20, + LOCTEX_UPPER_TATTOO = 21, + LOCTEX_LOWER_TATTOO = 22, + LOCTEX_NUM_ENTRIES = 23 }; //-------------------------------------------------------------------- @@ -719,6 +745,7 @@ class LLVOAvatar : LLUUID mLastLowerBodyBakedID; LLUUID mLastEyesBakedID; LLUUID mLastSkirtBakedID; + LLUUID mLastHairBakedID; //-------------------------------------------------------------------- // impostor state @@ -850,6 +877,59 @@ class LLVOAvatar : F32 mLastAppearanceBlendTime; BOOL mAppearanceAnimating; + //-------------------------------------------------------------------- + // boob bounce stuff + //-------------------------------------------------------------------- + +private: + bool mFirstSetActualBoobGravRan; + bool mFirstSetActualButtGravRan; + bool mFirstSetActualFatGravRan; + LLFrameTimer mBoobBounceTimer; + EmeraldAvatarLocalBoobConfig mLocalBoobConfig; + EmeraldBoobState mBoobState; + EmeraldBoobState mButtState; + EmeraldBoobState mFatState; + +public: + //boob + F32 getActualBoobGrav() { return mLocalBoobConfig.actualBoobGrav; } + void setActualBoobGrav(F32 grav) + { + mLocalBoobConfig.actualBoobGrav = grav; + if(!mFirstSetActualBoobGravRan) + { + mBoobState.boobGrav = grav; + mFirstSetActualBoobGravRan = true; + } + } + + //butt + F32 getActualButtGrav() { return mLocalBoobConfig.actualButtGrav; } + void setActualButtGrav(F32 grav) + { + mLocalBoobConfig.actualButtGrav = grav; + if(!mFirstSetActualButtGravRan) + { + mButtState.boobGrav = grav; + mFirstSetActualButtGravRan = true; + } + } + + //fat + F32 getActualFatGrav() { return mLocalBoobConfig.actualFatGrav; } + void setActualFatGrav(F32 grav) + { + mLocalBoobConfig.actualFatGrav = grav; + if(!mFirstSetActualFatGravRan) + { + mFatState.boobGrav = grav; + mFirstSetActualFatGravRan = true; + } + } + + static EmeraldGlobalBoobConfig sBoobConfig; + //-------------------------------------------------------------------- // we're morphing for lip sync //-------------------------------------------------------------------- @@ -926,6 +1006,7 @@ class LLVOAvatar : LLTexLayerSet* mLowerBodyLayerSet; LLTexLayerSet* mEyesLayerSet; LLTexLayerSet* mSkirtLayerSet; + LLTexLayerSet* mHairLayerSet; protected: @@ -960,6 +1041,8 @@ class LLVOAvatar : LLUUID mSavedTE[ TEX_NUM_ENTRIES ]; BOOL mFirstTEMessageReceived; BOOL mFirstAppearanceMessageReceived; + BOOL mHasBakedHair; + BOOL mSupportsAlphaLayers; // For backwards compatibility, TRUE for 1.19.2 and 1.22+ clients BOOL mHeadBakedLoaded; S32 mHeadMaskDiscard; @@ -969,6 +1052,7 @@ class LLVOAvatar : S32 mLowerMaskDiscard; BOOL mEyesBakedLoaded; BOOL mSkirtBakedLoaded; + BOOL mHairBakedLoaded; //RN: testing 2 pass rendering U32 mHeadMaskTexName; @@ -1051,4 +1135,19 @@ class LLVOAvatar : static void updateFreezeCounter(S32 counter = 0 ) ; }; +//----------------------------------------------------------------------------------------------- +// Inlines +//----------------------------------------------------------------------------------------------- +inline BOOL LLVOAvatar::isTextureDefined(U8 te) const +{ + return (getTEImage(te)->getID() != IMG_DEFAULT_AVATAR && getTEImage(te)->getID() != IMG_DEFAULT); +} + +inline BOOL LLVOAvatar::isTextureVisible(U8 te) const +{ + return ((isTextureDefined(te) || mIsSelf) + && (getTEImage(te)->getID() != IMG_INVISIBLE + || LLDrawPoolAlpha::sShowDebugAlpha)); +} + #endif // LL_VO_AVATAR_H diff --git a/linden/indra/newview/llvoiceremotectrl.cpp b/linden/indra/newview/llvoiceremotectrl.cpp index 3dc275f..eca9835 100644 --- a/linden/indra/newview/llvoiceremotectrl.cpp +++ b/linden/indra/newview/llvoiceremotectrl.cpp @@ -48,15 +48,16 @@ LLVoiceRemoteCtrl::LLVoiceRemoteCtrl (const std::string& name) : LLPanel(name) { setIsChrome(TRUE); - +/* if (gSavedSettings.getBOOL("ShowVoiceChannelPopup")) { LLUICtrlFactory::getInstance()->buildPanel(this, "panel_voice_remote_expanded.xml"); } else { +*/ LLUICtrlFactory::getInstance()->buildPanel(this, "panel_voice_remote.xml"); - } +// } setFocusRoot(TRUE); } @@ -81,6 +82,7 @@ BOOL LLVoiceRemoteCtrl::postBuild() mSpeakersBtn->setCallbackUserData(this); childSetAction("show_channel", onClickPopupBtn, this); +/* childSetAction("end_call_btn", onClickEndCall, this); LLTextBox* text = getChild("channel_label"); @@ -90,7 +92,7 @@ BOOL LLVoiceRemoteCtrl::postBuild() } childSetAction("voice_channel_bg", onClickVoiceChannel, this); - +*/ return TRUE; } @@ -161,7 +163,7 @@ void LLVoiceRemoteCtrl::draw() { active_channel_name = voice_floater->getShortTitle(); } - +/* LLVoiceChannel* current_channel = LLVoiceChannel::getCurrentVoiceChannel(); childSetEnabled("end_call_btn", LLVoiceClient::voiceEnabled() && current_channel @@ -198,7 +200,7 @@ void LLVoiceRemoteCtrl::draw() voice_channel_bg->setImageColor(bg_color); } } - +*/ LLButton* expand_button = getChild("show_channel"); if (expand_button) { diff --git a/linden/indra/newview/llvovolume.cpp b/linden/indra/newview/llvovolume.cpp index cb0d4bd..3fce975 100644 --- a/linden/indra/newview/llvovolume.cpp +++ b/linden/indra/newview/llvovolume.cpp @@ -65,6 +65,12 @@ #include "llselectmgr.h" #include "pipeline.h" +//MK +#include "llagent.h" + +extern BOOL RRenabled; +//mk + const S32 MIN_QUIET_FRAMES_COALESCE = 30; const F32 FORCE_SIMPLE_RENDER_AREA = 512.f; const F32 FORCE_CULL_AREA = 8.f; @@ -2094,7 +2100,11 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, { LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION); - if (facep->getViewerObject()->isSelected() && gHideSelectedObjects) + if (facep->getViewerObject()->isSelected() +//MK + && (!RRenabled || !gAgent.mRRInterface.mContainsEdit) +//mk + && gHideSelectedObjects) { return; } @@ -2181,6 +2191,8 @@ void LLVolumeGeometryManager::getGeometry(LLSpatialGroup* group) void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) { + static int warningsCount = 20; + if (LLPipeline::sSkipUpdate) { return; @@ -2258,8 +2270,12 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) //if not all buffers are unmapped if(num_mapped_veretx_buffer != LLVertexBuffer::sMappedCount) { + if(++warningsCount > 20) // Do not spam the log file uselessly... + { llwarns << "Not all mapped vertex buffers are unmapped!" << llendl ; - for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter) + warningsCount = 1; + } + for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter) { LLDrawable* drawablep = *drawable_iter; for (S32 i = 0; i < drawablep->getNumFaces(); ++i) diff --git a/linden/indra/newview/llwearable.cpp b/linden/indra/newview/llwearable.cpp index 6bdc50f..0a51923 100644 --- a/linden/indra/newview/llwearable.cpp +++ b/linden/indra/newview/llwearable.cpp @@ -67,6 +67,8 @@ const std::string LLWearable::sTypeName[ WT_COUNT+1 ] = "undershirt", "underpants", "skirt", + "alpha", + "tattoo", "invalid" }; @@ -86,6 +88,8 @@ const std::string LLWearable::sTypeLabel[ WT_COUNT+1 ] = "Undershirt", "Underpants", "Skirt", + "Alpha", + "Tattoo", "invalid" }; @@ -109,6 +113,8 @@ LLAssetType::EType LLWearable::typeToAssetType(EWearableType wearable_type) case WT_UNDERSHIRT: case WT_UNDERPANTS: case WT_SKIRT: + case WT_ALPHA: + case WT_TATTOO: return LLAssetType::AT_CLOTHING; default: return LLAssetType::AT_NONE; @@ -150,41 +156,87 @@ EWearableType LLWearable::typeNameToType( const std::string& type_name ) return WT_INVALID; } - -std::string terse_F32_to_string( F32 f ) +const char* terse_F32_to_string( F32 f, char s[MAX_STRING] ) /* Flawfinder: ignore */ { - std::string r = llformat( "%.2f", f ); + char* r = s; + S32 len = snprintf( s, MAX_STRING, "%.2f", f ); /* Flawfinder: ignore */ // "1.20" -> "1.2" // "24.00" -> "24." - S32 len = r.length(); - while( len > 0 && '0' == r[len - 1] ) + while( '0' == r[len - 1] ) { - r.erase(len-1, 1); - len--; + len--; + r[len] = '\0'; } if( '.' == r[len - 1] ) { // "24." -> "24" - r.erase(len-1, 1); + len--; + r[len] = '\0'; } else if( ('-' == r[0]) && ('0' == r[1]) ) { // "-0.59" -> "-.59" - r.erase(1, 1); + r++; + r[0] = '-'; } else if( '0' == r[0] ) { // "0.59" -> ".59" - r.erase(0, 1); + r++; } return r; } +// reX: new function +BOOL LLWearable::FileExportParams( FILE* file ) +{ + // wearable type + S32 type = (S32)mType; + fprintf( file, "type %d\n", type ); + + // parameters + S32 num_parameters = mVisualParamMap.size(); + fprintf( file, "parameters %d\n", num_parameters ); + + char s[ MAX_STRING ]; /* Flawfinder: ignore */ + for (param_map_t::iterator iter = mVisualParamMap.begin(); + iter != mVisualParamMap.end(); ++iter) + { + S32 param_id = iter->first; + F32 param_weight = iter->second; + fprintf( file, "%d %s\n", param_id, terse_F32_to_string( param_weight, s ) ); + } + + return TRUE; +} + +// reX: new function +BOOL LLWearable::FileExportTextures( FILE* file ) +{ + // wearable type + S32 type = (S32)mType; + fprintf( file, "type %d\n", type ); + + // texture entries + S32 num_textures = mTEMap.size(); + fprintf( file, "textures %d\n", num_textures ); + + for (te_map_t::iterator iter = mTEMap.begin(); + iter != mTEMap.end(); ++iter) + { + S32 te = iter->first; + LLUUID& image_id = iter->second; + fprintf( file, "%d %s\n", te, image_id.asString().c_str() ); + } + + return TRUE; +} + BOOL LLWearable::exportFile( LLFILE* file ) { // header and version @@ -231,12 +283,13 @@ BOOL LLWearable::exportFile( LLFILE* file ) return FALSE; } + char s[ MAX_STRING ]; /* Flawfinder: ignore */ for (param_map_t::iterator iter = mVisualParamMap.begin(); iter != mVisualParamMap.end(); ++iter) { S32 param_id = iter->first; F32 param_weight = iter->second; - if( fprintf( file, "%d %s\n", param_id, terse_F32_to_string( param_weight ).c_str() ) < 0 ) + if( fprintf( file, "%d %s\n", param_id, terse_F32_to_string( param_weight, s ) ) < 0 ) { return FALSE; } @@ -546,9 +599,52 @@ BOOL LLWearable::isDirty() weight = llclamp( weight, param->getMinWeight(), param->getMaxWeight() ); U8 a = F32_to_U8( param->getWeight(), param->getMinWeight(), param->getMaxWeight() ); - U8 b = F32_to_U8( weight, param->getMinWeight(), param->getMaxWeight() ); + + if(avatar->getAppearanceFlag() == true) + { + //boob + if(param->getID() == 507) + { + weight = get_if_there(mVisualParamMap, param->getID(), avatar->getActualBoobGrav()); + weight = llclamp( weight, param->getMinWeight(), param->getMaxWeight() ); + } + //butt + if(param->getID() == 795) + { + weight = get_if_there(mVisualParamMap, param->getID(), avatar->getActualButtGrav()); + weight = llclamp( weight, param->getMinWeight(), param->getMaxWeight() ); + } + //fat + if(param->getID() == 157) + { + weight = get_if_there(mVisualParamMap, param->getID(), avatar->getActualFatGrav()); + weight = llclamp( weight, param->getMinWeight(), param->getMaxWeight() ); + } + } + else + { + //boob + if(param->getID() == 507) + { + a = F32_to_U8( avatar->getActualBoobGrav(), param->getMinWeight(), param->getMaxWeight() ); + } + //butt + if(param->getID() == 795) + { + a = F32_to_U8( avatar->getActualButtGrav(), param->getMinWeight(), param->getMaxWeight() ); + } + //fat + if(param->getID() == 157) + { + a = F32_to_U8( avatar->getActualFatGrav(), param->getMinWeight(), param->getMaxWeight() ); + } + } + + + U8 b = F32_to_U8( weight, param->getMinWeight(), param->getMaxWeight() ); if( a != b ) { + llwarns << "param ID " << param->getID() << " was changed." << llendl; return TRUE; } } @@ -634,6 +730,16 @@ void LLWearable::writeToAvatar( BOOL set_by_user ) { S32 param_id = param->getID(); F32 weight = get_if_there(mVisualParamMap, param_id, param->getDefaultWeight()); + + //ZOMG: When switching shapes from inventory + if(param_id == 507) + avatar->setActualBoobGrav(weight); + if(param_id == 795) + avatar->setActualButtGrav(weight); + if(param_id == 157) + avatar->setActualFatGrav(weight); + + // only animate with user-originated changes if (set_by_user) { @@ -694,7 +800,7 @@ void LLWearable::writeToAvatar( BOOL set_by_user ) // if( set_by_user ) // { -// gAgent.sendAgentSetAppearance(); + gAgent.sendAgentSetAppearance(); // } } @@ -771,6 +877,22 @@ void LLWearable::readFromAvatar() { if( (((LLViewerVisualParam*)param)->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) ) { + + //pretty sure is right + if(param->getID() == 507) + avatar->setActualBoobGrav(param->getWeight()); + if(param->getID() == 151) + avatar->setActualButtGrav(param->getWeight()); + if(param->getID() == 157) + avatar->setActualFatGrav(param->getWeight()); + + //if(param->getID() == 507) + //{ + // llwarns << "current = " << avatar->getActualBoobGrav() << llendl; + // llwarns << "param weight = " << param->getWeight() << llendl; + //} + + mVisualParamMap[param->getID()] = param->getWeight(); } } @@ -822,6 +944,27 @@ void LLWearable::copyDataFrom( LLWearable* src ) { S32 id = param->getID(); F32 weight = get_if_there(src->mVisualParamMap, id, param->getDefaultWeight() ); + //llwarns << "------------------------------" << llendl; + //llwarns << "copydatafrom" << llendl; + //llwarns << "------------------------------" << llendl; + + //if(id == 507) + //{ + // llwarns << "weight = " << weight << llendl; + // llwarns << "actual = " << avatar->getActualBoobGrav() << llendl; + // llwarns << "mVisualParamMap[id] = " << mVisualParamMap[id] << llendl; + //} + + //pretty sure right + if(id == 507) + avatar->setActualBoobGrav(weight); + if(id == 795) + avatar->setActualButtGrav(weight); + if(id == 157) + avatar->setActualFatGrav(weight); + + + mVisualParamMap[id] = weight; } } diff --git a/linden/indra/newview/llwearable.h b/linden/indra/newview/llwearable.h index 7c7f3a2..e37d53e 100644 --- a/linden/indra/newview/llwearable.h +++ b/linden/indra/newview/llwearable.h @@ -55,7 +55,9 @@ enum EWearableType // If you change this, update LLWearable::getTypeName(), get WT_UNDERSHIRT = 10, WT_UNDERPANTS = 11, WT_SKIRT = 12, - WT_COUNT = 13, + WT_ALPHA = 13, + WT_TATTOO = 14, + WT_COUNT = 15, WT_INVALID = 255 }; @@ -78,6 +80,10 @@ class LLWearable BOOL exportFile(LLFILE* file); BOOL importFile(LLFILE* file); + // reX: new function + BOOL FileExportParams(FILE* file); + // reX: new function + BOOL FileExportTextures(FILE* file); EWearableType getType() const { return mType; } void setType( EWearableType type ) { mType = type; } @@ -118,11 +124,11 @@ class LLWearable friend std::ostream& operator<<(std::ostream &s, const LLWearable &w); -private: - // Private constructor used by LLWearableList +public: + // -not anymore Private- constructor used by LLWearableList LLWearable(const LLTransactionID& transactionID); LLWearable(const LLAssetID& assetID); - +private: static S32 sCurrentDefinitionVersion; // Depends on the current state of the avatar_lad.xml. S32 mDefinitionVersion; // Depends on the state of the avatar_lad.xml when this asset was created. std::string mName; diff --git a/linden/indra/newview/llwindebug.cpp b/linden/indra/newview/llwindebug.cpp index 77bf5d3..d724a02 100644 --- a/linden/indra/newview/llwindebug.cpp +++ b/linden/indra/newview/llwindebug.cpp @@ -853,7 +853,7 @@ void LLWinDebug::generateCrashStacks(struct _EXCEPTION_POINTERS *exception_infop // LLSD info; std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, - "RainbowViewerException"); + "CoolViewerException"); std::string log_path = dump_path + ".log"; if (exception_infop) @@ -869,8 +869,8 @@ void LLWinDebug::generateCrashStacks(struct _EXCEPTION_POINTERS *exception_infop ExInfo.ExceptionPointers = exception_infop; ExInfo.ClientPointers = NULL; - writeDumpToFile(MiniDumpNormal, &ExInfo, "RainbowViewer.dmp"); - writeDumpToFile((MINIDUMP_TYPE)(MiniDumpWithDataSegs | MiniDumpWithIndirectlyReferencedMemory), &ExInfo, "RainbowViewerPlus.dmp"); + writeDumpToFile(MiniDumpNormal, &ExInfo, "CoolViewer.dmp"); + writeDumpToFile((MINIDUMP_TYPE)(MiniDumpWithDataSegs | MiniDumpWithIndirectlyReferencedMemory), &ExInfo, "CoolViewerPlus.dmp"); } info = Get_Exception_Info(exception_infop); @@ -906,6 +906,6 @@ void LLWinDebug::generateCrashStacks(struct _EXCEPTION_POINTERS *exception_infop void LLWinDebug::clearCrashStacks() { LLSD info; - std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "RainbowViewerException.log"); + std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "CoolViewerException.log"); LLFile::remove(dump_path); } diff --git a/linden/indra/newview/llwlparammanager.cpp b/linden/indra/newview/llwlparammanager.cpp index c1723f7..0f0ee6a 100644 --- a/linden/indra/newview/llwlparammanager.cpp +++ b/linden/indra/newview/llwlparammanager.cpp @@ -61,6 +61,10 @@ #include "curl/curl.h" +//MK +extern BOOL RRenabled; +//mk + LLWLParamManager * LLWLParamManager::sInstance = NULL; LLWLParamManager::LLWLParamManager() : @@ -232,6 +236,12 @@ void LLWLParamManager::loadPreset(const std::string & name,bool propagate) return; } +//MK + if (RRenabled) + { + gAgent.mRRInterface.setLastLoadedPreset (name); + } +//mk if(propagate) { diff --git a/linden/indra/newview/nrc_install.exe b/linden/indra/newview/nrc_install.exe new file mode 100644 index 0000000..1c43f00 Binary files /dev/null and b/linden/indra/newview/nrc_install.exe differ diff --git a/linden/indra/newview/pipeline.cpp b/linden/indra/newview/pipeline.cpp index 13d8d09..e6bc795 100644 --- a/linden/indra/newview/pipeline.cpp +++ b/linden/indra/newview/pipeline.cpp @@ -125,6 +125,10 @@ extern BOOL gHideSelectedObjects; extern BOOL gDisplaySwapBuffers; extern BOOL gDebugGL; +//MK +extern BOOL RRenabled; +//mk + // hack counter for rendering a fixed number of frames after toggling // fullscreen to work around DEV-5361 static S32 sDelayedVBOEnable = 0; @@ -1223,7 +1227,11 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl LLGLDisable test(GL_ALPHA_TEST); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gGL.setColorMask(false, false); + if (sUseOcclusion > 1) + { + gGL.setColorMask(false, false); + } + LLGLDepthTest depth(GL_TRUE, GL_FALSE); for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); @@ -1284,10 +1292,14 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl gGL.setColorMask(true, false); glPopMatrix(); + if (sUseOcclusion > 1) + { + gGL.setColorMask(true, false); + } + if (to_texture) { mScreen.flush(); - LLRenderTarget::unbindTarget(); } else if (LLPipeline::sUseOcclusion > 1) { @@ -1594,8 +1606,8 @@ void LLPipeline::shiftObjects(const LLVector3 &offset) assertInitialized(); glClear(GL_DEPTH_BUFFER_BIT); - gDepthDirty = FALSE; - + gDepthDirty = TRUE; + for (LLDrawable::drawable_vector_t::iterator iter = mShiftList.begin(); iter != mShiftList.end(); iter++) { @@ -1793,7 +1805,10 @@ void LLPipeline::stateSort(LLDrawable* drawablep, LLCamera& camera) return; } - if (gHideSelectedObjects) + if (gHideSelectedObjects +//MK + && (!RRenabled || !gAgent.mRRInterface.mContainsEdit)) +//mk { if (drawablep->getVObj().notNull() && drawablep->getVObj()->isSelected()) @@ -2044,6 +2059,22 @@ void LLPipeline::postSort(LLCamera& camera) } LLSpatialGroup::sNoDelete = TRUE; + + const S32 bin_count = 1024*8; + + static LLCullResult::drawinfo_list_t alpha_bins[bin_count]; + static U32 bin_size[bin_count]; + + //clear one bin per frame to avoid memory bloat + static S32 clear_idx = 0; + clear_idx = (1+clear_idx)%bin_count; + alpha_bins[clear_idx].clear(); + + for (U32 j = 0; j < bin_count; j++) + { + bin_size[j] = 0; + } + //build render map for (LLCullResult::sg_list_t::iterator i = sCull->beginVisibleGroups(); i != sCull->endVisibleGroups(); ++i) { @@ -2486,26 +2517,28 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate) iter1 = iter2; stop_glerror(); } - } LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderDrawPoolsEnd"); LLVertexBuffer::unbind(); - LLGLState::checkStates(); - LLGLState::checkTextureChannels(); - LLGLState::checkClientArrays(); - - gGLLastMatrix = NULL; - glLoadMatrixd(gGLModelView); - - if (occlude) - { - occlude = FALSE; + gGLLastMatrix = NULL; glLoadMatrixd(gGLModelView); - doOcclusion(camera); + + if (occlude) + { + occlude = FALSE; + gGLLastMatrix = NULL; + glLoadMatrixd(gGLModelView); + doOcclusion(camera); + } } + LLVertexBuffer::unbind(); + LLGLState::checkStates(); + LLGLState::checkTextureChannels(); + LLGLState::checkClientArrays(); + stop_glerror(); LLGLState::checkStates(); @@ -2742,7 +2775,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())) { @@ -5264,6 +5301,10 @@ void LLPipeline::renderGroups(LLRenderPass* pass, U32 type, U32 mask, BOOL textu void LLPipeline::generateImpostor(LLVOAvatar* avatar) { + LLGLState::checkStates(); + LLGLState::checkTextureChannels(); + LLGLState::checkClientArrays(); + static LLCullResult result; result.clear(); grabReferences(result); @@ -5453,6 +5494,11 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar) avatar->mNeedsImpostorUpdate = FALSE; avatar->cacheImpostorValues(); + + LLVertexBuffer::unbind(); + LLGLState::checkStates(); + LLGLState::checkTextureChannels(); + LLGLState::checkClientArrays(); } BOOL LLPipeline::hasRenderBatches(const U32 type) const diff --git a/linden/indra/newview/prefsrainbow.cpp b/linden/indra/newview/prefsrainbow.cpp index 72233a7..8ef57d7 100644 --- a/linden/indra/newview/prefsrainbow.cpp +++ b/linden/indra/newview/prefsrainbow.cpp @@ -50,20 +50,33 @@ 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; + BOOL mRestrainedLove; + BOOL mBreastPhysics; BOOL mSecondsInChatAndIMs; + BOOL mPreviewAnimInWorld; + BOOL mSpeedRez; + BOOL mRevokePermsOnStandUp; + BOOL mRezWithLandGroup; + U32 mSpeedRezInterval; + U32 mDecimalsForTools; + U32 mLinksForChattingObjects; U32 mTimeFormat; U32 mDateFormat; }; @@ -73,26 +86,97 @@ LLPrefsRainbowImpl::LLPrefsRainbowImpl() : LLPanel("Rainbow Prefs Panel") { LLUICtrlFactory::getInstance()->buildPanel(this, "panel_preferences_rainbow.xml"); + childSetCommitCallback("restrained_love_check", onCommitCheckBox, this); + childSetCommitCallback("speed_rez_check", onCommitCheckBox, this); refresh(); } -void LLPrefsRainbowImpl::refreshValues() +//static +void LLPrefsRainbowImpl::onCommitCheckBox(LLUICtrl* ctrl, void* user_data) { - mShowGrids = gSavedSettings.getBOOL("ForceShowGrid"); - mSaveScriptsAsMono = gSavedSettings.getBOOL("SaveScriptsAsMono"); - mDoubleClickTeleport = gSavedSettings.getBOOL("DoubleClickTeleport"); - mHideNotificationsInChat = gSavedSettings.getBOOL("HideNotificationsInChat"); - mUseOldTrackingDots = gSavedSettings.getBOOL("UseOldTrackingDots"); - mAllowMUpose = gSavedSettings.getBOOL("AllowMUpose"); - mAutoCloseOOC = gSavedSettings.getBOOL("AutoCloseOOC"); - mPrivateLookAt = gSavedSettings.getBOOL("PrivateLookAt"); - mSecondsInChatAndIMs = gSavedSettings.getBOOL("SecondsInChatAndIMs"); - mFetchInventoryOnLogin = gSavedSettings.getBOOL("FetchInventoryOnLogin"); + LLPrefsRainbowImpl* self = (LLPrefsRainbowImpl*)user_data; + if (self->childGetValue("restrained_love_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"); + } + + if (self->childGetValue("speed_rez_check").asBoolean()) + { + self->childEnable("speed_rez_interval"); + self->childEnable("speed_rez_seconds"); + } + else + { + self->childDisable("speed_rez_interval"); + self->childDisable("speed_rez_seconds"); + } } void LLPrefsRainbowImpl::refresh() { - refreshValues(); + mShowGrids = gSavedSettings.getBOOL("ForceShowGrid"); + mSaveScriptsAsMono = gSavedSettings.getBOOL("SaveScriptsAsMono"); + 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"); + mRestrainedLove = gSavedSettings.getBOOL("RestrainedLove"); + mBreastPhysics = gSavedSettings.getBOOL("EmeraldBreastPhysicsToggle"); + mRezWithLandGroup = gSavedSettings.getBOOL("RezWithLandGroup"); + if (mRestrainedLove) + { + mFetchInventoryOnLogin = TRUE; + gSavedSettings.setBOOL("FetchInventoryOnLogin", TRUE); + } + else + { + mFetchInventoryOnLogin = gSavedSettings.getBOOL("FetchInventoryOnLogin"); + } + mPreviewAnimInWorld = gSavedSettings.getBOOL("PreviewAnimInWorld"); + mSpeedRez = gSavedSettings.getBOOL("SpeedRez"); + mSpeedRezInterval = gSavedSettings.getU32("SpeedRezInterval"); + + if (LLStartUp::getStartupState() != STATE_STARTED) + { + childDisable("restrained_love_check"); + } + + if (mRestrainedLove) + { + childSetValue("fetch_inventory_on_login_check", TRUE); + childDisable("fetch_inventory_on_login_check"); + } + else + { + childEnable("fetch_inventory_on_login_check"); + } + + if (mSpeedRez) + { + childEnable("speed_rez_interval"); + childEnable("speed_rez_seconds"); + } + else + { + childDisable("speed_rez_interval"); + childDisable("speed_rez_seconds"); + } + std::string format = gSavedSettings.getString("ShortTimeFormat"); if (format.find("%p") == -1) { @@ -138,13 +222,24 @@ void LLPrefsRainbowImpl::cancel() 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("PlayTypingSound", mPlayTypingSound); gSavedSettings.setBOOL("PrivateLookAt", mPrivateLookAt); gSavedSettings.setBOOL("FetchInventoryOnLogin", mFetchInventoryOnLogin); - gSavedSettings.setBOOL("RestrainedLife", mRestrainedLife); + gSavedSettings.setBOOL("RestrainedLove", mRestrainedLove); + gSavedSettings.setBOOL("EmeraldBreastPhysicsToggle", mBreastPhysics); gSavedSettings.setBOOL("SecondsInChatAndIMs", mSecondsInChatAndIMs); + gSavedSettings.setBOOL("PreviewAnimInWorld", mPreviewAnimInWorld); + gSavedSettings.setBOOL("SpeedRez", mSpeedRez); + gSavedSettings.setBOOL("RezWithLandGroup", mRezWithLandGroup); + gSavedSettings.setU32("SpeedRezInterval", mSpeedRezInterval); } void LLPrefsRainbowImpl::apply() @@ -199,8 +294,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..e49fc46 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 "FileVersion", "1.22.12.0" - VALUE "InternalName", "Rainbow Viewer" + VALUE "FileDescription", "Rainbow Viewer:Cool Edition" + VALUE "FileVersion", "1.22.12.13" + 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 R13" END END BLOCK "VarFileInfo" diff --git a/linden/indra/newview/skins/default/textures/inv_item_alpha.tga b/linden/indra/newview/skins/default/textures/inv_item_alpha.tga new file mode 100644 index 0000000..b041492 Binary files /dev/null and b/linden/indra/newview/skins/default/textures/inv_item_alpha.tga differ diff --git a/linden/indra/newview/skins/default/textures/inv_item_tattoo.tga b/linden/indra/newview/skins/default/textures/inv_item_tattoo.tga new file mode 100644 index 0000000..fdf6c0a Binary files /dev/null and b/linden/indra/newview/skins/default/textures/inv_item_tattoo.tga differ diff --git a/linden/indra/newview/skins/default/textures/textures.xml b/linden/indra/newview/skins/default/textures/textures.xml index 9e1d9b5..b3a489f 100644 --- a/linden/indra/newview/skins/default/textures/textures.xml +++ b/linden/indra/newview/skins/default/textures/textures.xml @@ -114,7 +114,7 @@ - + @@ -138,6 +138,7 @@ + diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_animation_preview.xml b/linden/indra/newview/skins/default/xui/en-us/floater_animation_preview.xml index 4038f4f..620ea52 100644 --- a/linden/indra/newview/skins/default/xui/en-us/floater_animation_preview.xml +++ b/linden/indra/newview/skins/default/xui/en-us/floater_animation_preview.xml @@ -1,6 +1,6 @@ @@ -180,7 +180,7 @@ - + Unable to read animation file. We recommend BVH files exported from Poser 4. @@ -202,4 +202,7 @@ Maximum animation length is [MAX_LENGTH] seconds. [STATUS] + + The animation preview is played on your avatar. + 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_build_options.xml b/linden/indra/newview/skins/default/xui/en-us/floater_build_options.xml index 807caa0..3976f31 100644 --- a/linden/indra/newview/skins/default/xui/en-us/floater_build_options.xml +++ b/linden/indra/newview/skins/default/xui/en-us/floater_build_options.xml @@ -1,8 +1,8 @@ + can_resize="false" follows="right" height="165" min_height="165" + min_width="320" mouse_opaque="true" name="build options floater" + rect_control="FloaterBuildOptionsRect" title="Grid Options" width="320"> + diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_camera.xml b/linden/indra/newview/skins/default/xui/en-us/floater_camera.xml index 29e05da..fbbedb8 100644 --- a/linden/indra/newview/skins/default/xui/en-us/floater_camera.xml +++ b/linden/indra/newview/skins/default/xui/en-us/floater_camera.xml @@ -19,6 +19,6 @@ Draw distance 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 - - +