From 3b168065d51d5288b54bb2135dfe4f9146e54050 Mon Sep 17 00:00:00 2001 From: Player Dagostino Date: Tue, 2 Aug 2011 20:01:20 +0200 Subject: [PATCH] Another port of a great patch from CoolViewer that lets users set the maximum number of actual visible avatars when impostors are on. --- indra/newview/llfloaterhardwaresettings.cpp | 53 +++++++++++++++---- indra/newview/llfloaterhardwaresettings.h | 12 ++--- indra/newview/llpaneldisplay.cpp | 16 ++++++ indra/newview/llpaneldisplay.h | 2 + indra/newview/llviewermenu.cpp | 4 -- .../xui/en-us/floater_hardware_settings.xml | 37 +++++++++++-- .../xui/en-us/panel_preferences_graphics1.xml | 19 ++++--- 7 files changed, 111 insertions(+), 32 deletions(-) diff --git a/indra/newview/llfloaterhardwaresettings.cpp b/indra/newview/llfloaterhardwaresettings.cpp index 23da0629b..30fa5a305 100644 --- a/indra/newview/llfloaterhardwaresettings.cpp +++ b/indra/newview/llfloaterhardwaresettings.cpp @@ -47,27 +47,25 @@ #include "pipeline.h" LLFloaterHardwareSettings* LLFloaterHardwareSettings::sHardwareSettings = NULL; +BOOL LLFloaterHardwareSettings::sUseStreamVBOexists = FALSE; LLFloaterHardwareSettings::LLFloaterHardwareSettings() : LLFloater(std::string("Hardware Settings Floater")) { LLUICtrlFactory::getInstance()->buildFloater(this, "floater_hardware_settings.xml"); - - // load it up - initCallbacks(); } LLFloaterHardwareSettings::~LLFloaterHardwareSettings() { } -void LLFloaterHardwareSettings::onClickHelp(void* data) -{ - const char* xml_alert = "HardwareSettingsHelpButton"; - LLNotifications::instance().add(xml_alert); -} - -void LLFloaterHardwareSettings::initCallbacks(void) +void LLFloaterHardwareSettings::onCommitCheckBoxVBO(LLUICtrl* ctrl, void* user_data) { + LLFloaterHardwareSettings* self = (LLFloaterHardwareSettings*)user_data; + if (self && sUseStreamVBOexists) + { + gSavedSettings.setBOOL("RenderUseStreamVBO", self->childGetValue("stream_vbo").asBoolean()); + self->refreshEnabledState(); + } } // menu maintenance functions @@ -77,6 +75,10 @@ void LLFloaterHardwareSettings::refresh() LLPanel::refresh(); mUseVBO = gSavedSettings.getBOOL("RenderVBOEnable"); + if (sUseStreamVBOexists) + { + mUseStreamVBO = gSavedSettings.getBOOL("RenderUseStreamVBO"); + } mUseFBO = gSavedSettings.getBOOL("RenderUseFBO"); mUseAniso = gSavedSettings.getBOOL("RenderAnisotropic"); mFSAASamples = gSavedSettings.getU32("RenderFSAASamples"); @@ -96,6 +98,7 @@ void LLFloaterHardwareSettings::refreshEnabledState() childSetMinValue("GrapicsCardTextureMemory", min_tex_mem); childSetMaxValue("GrapicsCardTextureMemory", max_tex_mem); + bool vbo_ok = true; mLastVBOState = LLVertexBuffer::sEnableVBOs; if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderVBOEnable") || !gGLManager.mHasVertexBufferObject) @@ -103,6 +106,23 @@ void LLFloaterHardwareSettings::refreshEnabledState() childSetEnabled("vbo", FALSE); //Streaming VBOs -Shyotl childSetEnabled("vbo_stream", FALSE); + vbo_ok = false; + } + + if (sUseStreamVBOexists) + { + childSetVisible("stream_vbo", true); + childSetEnabled("stream_vbo", vbo_ok && childGetValue("vbo") && + LLFeatureManager::getInstance()->isFeatureAvailable("RenderUseStreamVBO")); + } + else + { + childSetVisible("stream_vbo", false); + } + + if (!LLFeatureManager::getInstance()->isFeatureAvailable("UseOcclusion")) + { + childSetEnabled("occlusion", false); } else { @@ -115,7 +135,7 @@ void LLFloaterHardwareSettings::refreshEnabledState() childSetEnabled("gamma", !gPipeline.canUseWindLightShaders()); childSetEnabled("(brightness, lower is brighter)", !gPipeline.canUseWindLightShaders()); childSetEnabled("fog", !gPipeline.canUseWindLightShaders()); - + childSetVisible("note", gPipeline.canUseWindLightShaders()); } // static instance of it @@ -173,6 +193,13 @@ BOOL LLFloaterHardwareSettings::postBuild() { childSetAction("OK", onBtnOK, this); + sUseStreamVBOexists = gSavedSettings.controlExists("RenderUseStreamVBO"); + if (sUseStreamVBOexists) + { + childSetCommitCallback("vbo", onCommitCheckBoxVBO, this); + childSetCommitCallback("stream_vbo", onCommitCheckBoxVBO, this); + } + refresh(); return TRUE; @@ -202,6 +229,10 @@ void LLFloaterHardwareSettings::apply() void LLFloaterHardwareSettings::cancel() { gSavedSettings.setBOOL("RenderVBOEnable", mUseVBO); + if (sUseStreamVBOexists) + { + gSavedSettings.setBOOL("RenderUseStreamVBO", mUseStreamVBO); + } gSavedSettings.setBOOL("RenderUseFBO", mUseFBO); gSavedSettings.setBOOL("RenderAnisotropic", mUseAniso); gSavedSettings.setU32("RenderFSAASamples", mFSAASamples); diff --git a/indra/newview/llfloaterhardwaresettings.h b/indra/newview/llfloaterhardwaresettings.h index 0d78d67a2..804b26dd9 100644 --- a/indra/newview/llfloaterhardwaresettings.h +++ b/indra/newview/llfloaterhardwaresettings.h @@ -49,14 +49,11 @@ public: virtual BOOL postBuild(); - /// initialize all the callbacks for the menu - void initCallbacks(void); - /// one and one instance only static LLFloaterHardwareSettings* instance(); - /// callback for the menus help button - static void onClickHelp(void* data); + /// callback for the VBO-related settings checkboxes + static void onCommitCheckBoxVBO(LLUICtrl* ctrl, void* user_data); /// OK button static void onBtnOK( void* userdata ); @@ -87,11 +84,12 @@ public: /// refresh the enabled values void refreshEnabledState(); -protected: +private: LLSliderCtrl* mCtrlVideoCardMem; //Retained values for cancel/reset BOOL mUseVBO; + BOOL mUseStreamVBO; BOOL mUseFBO; BOOL mUseAniso; U32 mFSAASamples; @@ -101,9 +99,9 @@ protected: BOOL mProbeHardwareOnStartup; bool mLastVBOState; //track changes to LLVertexBuffer::sEnableVBOs every frame. Bleh. -private: // one instance on the inside static LLFloaterHardwareSettings* sHardwareSettings; + static BOOL sUseStreamVBOexists; }; #endif diff --git a/indra/newview/llpaneldisplay.cpp b/indra/newview/llpaneldisplay.cpp index c7aeabcce..b5b69bcfc 100644 --- a/indra/newview/llpaneldisplay.cpp +++ b/indra/newview/llpaneldisplay.cpp @@ -260,6 +260,9 @@ BOOL LLPanelDisplay::postBuild() // Avatar Render Mode mCtrlAvatarCloth = getChild("AvatarCloth"); mCtrlAvatarImpostors = getChild("AvatarImpostors"); + mCtrlAvatarImpostors->setCommitCallback(&LLPanelDisplay::onVertexShaderEnable); + mCtrlAvatarImpostors->setCallbackUserData(this); + mCtrlNonImpostors = getChild("AvatarMaxVisible"); //---------------------------------------------------------------------------- // radio set for lighting detail @@ -417,6 +420,7 @@ void LLPanelDisplay::refresh() // avatar settings mAvatarImpostors = gSavedSettings.getBOOL("RenderUseImpostors"); + mNonImpostors = gSavedSettings.getS32("RenderAvatarMaxVisible"); mAvatarCloth = gSavedSettings.getBOOL("RenderAvatarCloth"); // Draw distance @@ -514,6 +518,9 @@ void LLPanelDisplay::refreshEnabledState() //GI won't do anything with shadows off, but disabling it here is less than intuitive. Ignore shadow setting for now. mCtrlDeferredGI->setEnabled(mCtrlShadowDetail->getEnabled()/* && gSavedSettings.getS32("RenderShadowDetail") > 0*/); + // Disable max non-impostors slider if avatar impostors are off + mCtrlNonImpostors->setEnabled(gSavedSettings.getBOOL("RenderUseImpostors")); + // Vertex Shaders // mCtrlShaderEnable->setEnabled(LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable")); // [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0a @@ -612,6 +619,7 @@ void LLPanelDisplay::disableUnavailableSettings() { mCtrlAvatarImpostors->setEnabled(FALSE); mCtrlAvatarImpostors->setValue(FALSE); + mCtrlNonImpostors->setEnabled(FALSE); } // disabled deferred if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred")) @@ -654,6 +662,7 @@ void LLPanelDisplay::setHiddenGraphicsState(bool isHidden) llassert(mCtrlAvatarVP != NULL); llassert(mCtrlShaderEnable != NULL); llassert(mCtrlAvatarImpostors != NULL); + llassert(mCtrlNonImpostors != NULL); llassert(mCtrlAvatarCloth != NULL); llassert(mRadioLightingDetail2 != NULL); @@ -702,6 +711,7 @@ void LLPanelDisplay::setHiddenGraphicsState(bool isHidden) mCtrlAvatarVP->setVisible(!isHidden); mCtrlShaderEnable->setVisible(!isHidden); mCtrlAvatarImpostors->setVisible(!isHidden); + mCtrlNonImpostors->setVisible(!isHidden); mCtrlAvatarCloth->setVisible(!isHidden); mRadioLightingDetail2->setVisible(!isHidden); @@ -752,6 +762,7 @@ void LLPanelDisplay::cancel() gSavedSettings.setS32("RenderShadowDetail", mShadowDetail); gSavedSettings.setBOOL("RenderUseImpostors", mAvatarImpostors); + gSavedSettings.setS32("RenderAvatarMaxVisible", mNonImpostors); gSavedSettings.setBOOL("RenderAvatarCloth", mAvatarCloth); gSavedSettings.setBOOL("RenderLocalLights", mLocalLights); @@ -994,6 +1005,11 @@ void LLPanelDisplay::onVertexShaderEnable(LLUICtrl* self, void* data) void LLPanelDisplay::setHardwareDefaults(void* user_data) { LLFeatureManager::getInstance()->applyRecommendedSettings(); + LLControlVariable* controlp = gSavedSettings.getControl("RenderAvatarMaxVisible"); + if (controlp) + { + controlp->resetToDefault(true); + } LLFloaterPreference::refreshEnabledGraphics(); } diff --git a/indra/newview/llpaneldisplay.h b/indra/newview/llpaneldisplay.h index a36311390..5631a7ca9 100644 --- a/indra/newview/llpaneldisplay.h +++ b/indra/newview/llpaneldisplay.h @@ -106,6 +106,7 @@ protected: LLSliderCtrl *mCtrlSkyFactor; // LOD for terrain LLSliderCtrl *mCtrlMaxParticle; // Max Particle LLSliderCtrl *mCtrlPostProcess; // Max Particle + LLSliderCtrl *mCtrlNonImpostors; // Max non-impostors LLCheckBoxCtrl *mCtrlBumpShiny; LLCheckBoxCtrl *mCtrlWindLight; @@ -162,6 +163,7 @@ protected: S32 mShadowDetail; BOOL mAvatarImpostors; + S32 mNonImpostors; BOOL mAvatarCloth; S32 mAvatarMode; BOOL mLocalLights; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 90cff3cdc..572cbc741 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -1524,10 +1524,6 @@ void init_debug_rendering_menu(LLMenuGL* menu) 'R', MASK_CONTROL|MASK_SHIFT)); LLMenuItemCheckGL* item; - item = new LLMenuItemCheckGL("Object-Object Occlusion", menu_toggle_control, NULL, menu_check_control, (void*)"UseOcclusion", 'O', MASK_CONTROL|MASK_SHIFT); - item->setEnabled(gGLManager.mHasOcclusionQuery && LLFeatureManager::getInstance()->isFeatureAvailable("UseOcclusion")); - menu->append(item); - item = new LLMenuItemCheckGL("Debug GL", menu_toggle_control, NULL, menu_check_control, (void*)"RenderDebugGL"); menu->append(item); diff --git a/indra/newview/skins/default/xui/en-us/floater_hardware_settings.xml b/indra/newview/skins/default/xui/en-us/floater_hardware_settings.xml index 21ba6b168..347c69a6b 100644 --- a/indra/newview/skins/default/xui/en-us/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/en-us/floater_hardware_settings.xml @@ -1,7 +1,7 @@ - Enable VBO: + Vertex Buffer Object: + + + + + Occlusion: + + + + + Note: the Gamma and Fog Distance Ratio settings are unavailable (since useless) when the + Atmospheric Shaders are enabled. + +