From d0b03a62fd799317d5da0bd56615739ce3b5b052 Mon Sep 17 00:00:00 2001 From: Jacek Antonelli Date: Fri, 15 Aug 2008 23:45:54 -0500 Subject: Second Life viewer sources 1.20.9 --- linden/indra/newview/app_settings/settings.xml | 28 +- linden/indra/newview/llappviewer.cpp | 133 +- linden/indra/newview/llappviewer.h | 5 +- linden/indra/newview/llappviewerlinux.cpp | 6 +- linden/indra/newview/llappviewerwin32.cpp | 5 +- linden/indra/newview/llchatbar.cpp | 1 + linden/indra/newview/lldrawable.cpp | 13 + linden/indra/newview/lldrawpoolalpha.cpp | 1 + linden/indra/newview/lldrawpoolbump.cpp | 26 +- linden/indra/newview/lldynamictexture.cpp | 5 +- linden/indra/newview/llface.cpp | 4 + linden/indra/newview/llface.h | 3 + linden/indra/newview/llfirstuse.cpp | 26 +- linden/indra/newview/llflexibleobject.cpp | 2 +- linden/indra/newview/llfloateranimpreview.cpp | 2 +- linden/indra/newview/llfloateravatarinfo.cpp | 5 + linden/indra/newview/llfloaterchat.cpp | 3 +- linden/indra/newview/llfloaterreporter.cpp | 2 +- linden/indra/newview/llfloatertos.cpp | 2 +- linden/indra/newview/llfloaterworldmap.cpp | 2 + linden/indra/newview/llfolderview.cpp | 86 +- linden/indra/newview/llfolderview.h | 34 +- linden/indra/newview/llgroupnotify.cpp | 7 + linden/indra/newview/llimpanel.cpp | 5 +- linden/indra/newview/llpaneldirfind.cpp | 12 +- linden/indra/newview/llpaneldirplaces.cpp | 168 +- linden/indra/newview/llpaneldirplaces.h | 20 +- linden/indra/newview/llpanelgeneral.cpp | 12 +- linden/indra/newview/llpanelgeneral.h | 2 +- linden/indra/newview/llpanellogin.cpp | 21 +- linden/indra/newview/llselectmgr.cpp | 10 + linden/indra/newview/llspatialpartition.cpp | 22 +- linden/indra/newview/llspatialpartition.h | 5 +- linden/indra/newview/llstartup.cpp | 1 - linden/indra/newview/lltoolbrush.cpp | 8 +- linden/indra/newview/lltoolbrush.h | 1 - linden/indra/newview/lltoolpie.cpp | 1 + linden/indra/newview/lltoolselectland.cpp | 8 +- linden/indra/newview/lltoolselectland.h | 1 - linden/indra/newview/llviewerdisplay.cpp | 78 +- linden/indra/newview/llviewerdisplay.h | 1 + linden/indra/newview/llviewerimage.cpp | 2 +- linden/indra/newview/llviewerimagelist.cpp | 4 + linden/indra/newview/llviewerobject.cpp | 16 +- linden/indra/newview/llviewerobjectlist.cpp | 1 + linden/indra/newview/llviewerregion.cpp | 133 +- linden/indra/newview/llviewerregion.h | 5 + linden/indra/newview/llviewerwindow.cpp | 73 +- linden/indra/newview/llvovolume.cpp | 2 +- linden/indra/newview/llwatchdog.cpp | 68 +- linden/indra/newview/llwatchdog.h | 3 + linden/indra/newview/llwearable.cpp | 33 +- linden/indra/newview/llwearable.h | 2 +- linden/indra/newview/llwearablelist.cpp | 112 +- linden/indra/newview/pipeline.cpp | 25 +- linden/indra/newview/releasenotes.txt | 242 +- linden/indra/newview/skins/xui/de/alerts.xml | 65 +- .../newview/skins/xui/de/floater_directory.xml | 30 +- linden/indra/newview/skins/xui/de/floater_im.xml | 3 + .../newview/skins/xui/de/floater_script_debug.xml | 2 +- .../newview/skins/xui/de/floater_world_map.xml | 27 +- linden/indra/newview/skins/xui/de/need_to_long.xml | 142 +- .../newview/skins/xui/de/need_to_translate.xml | 2553 +++++++------------- .../indra/newview/skins/xui/de/need_to_update.xml | 407 +--- linden/indra/newview/skins/xui/de/notify.xml | 15 + .../skins/xui/de/panel_avatar_classified.xml | 12 +- .../newview/skins/xui/de/panel_classified.xml | 12 +- .../newview/skins/xui/de/panel_group_general.xml | 12 + .../newview/skins/xui/de/panel_group_notices.xml | 6 +- linden/indra/newview/skins/xui/de/panel_login.xml | 2 +- .../skins/xui/de/panel_preferences_graphics1.xml | 26 +- .../newview/skins/xui/de/panel_preferences_web.xml | 6 +- .../newview/skins/xui/de/panel_region_general.xml | 6 + linden/indra/newview/skins/xui/de/strings.xml | 390 +++ linden/indra/newview/skins/xui/en-us/alerts.xml | 2 +- .../newview/skins/xui/en-us/floater_critical.xml | 15 +- .../newview/skins/xui/en-us/floater_directory.xml | 149 +- .../xui/en-us/floater_instant_message_group.xml | 2 +- .../newview/skins/xui/en-us/floater_sell_land.xml | 8 +- .../skins/xui/en-us/panel_region_estate.xml | 2 +- linden/indra/newview/skins/xui/ja/alerts.xml | 77 +- .../newview/skins/xui/ja/floater_directory.xml | 33 +- linden/indra/newview/skins/xui/ja/floater_im.xml | 3 + .../newview/skins/xui/ja/floater_script_debug.xml | 2 +- .../newview/skins/xui/ja/floater_world_map.xml | 12 +- linden/indra/newview/skins/xui/ja/need_to_long.xml | 191 +- .../newview/skins/xui/ja/need_to_translate.xml | 2537 +++++++------------ .../indra/newview/skins/xui/ja/need_to_update.xml | 392 +-- linden/indra/newview/skins/xui/ja/notify.xml | 15 + .../skins/xui/ja/panel_avatar_classified.xml | 12 +- .../newview/skins/xui/ja/panel_classified.xml | 12 +- .../newview/skins/xui/ja/panel_group_general.xml | 12 + .../newview/skins/xui/ja/panel_group_notices.xml | 3 +- linden/indra/newview/skins/xui/ja/panel_login.xml | 2 +- .../skins/xui/ja/panel_preferences_graphics1.xml | 22 +- .../newview/skins/xui/ja/panel_preferences_web.xml | 6 +- .../newview/skins/xui/ja/panel_region_general.xml | 6 + linden/indra/newview/skins/xui/ja/strings.xml | 390 +++ linden/indra/newview/skins/xui/ko/alerts.xml | 72 +- .../newview/skins/xui/ko/floater_directory.xml | 31 +- linden/indra/newview/skins/xui/ko/floater_im.xml | 3 + .../newview/skins/xui/ko/floater_script_debug.xml | 2 +- .../newview/skins/xui/ko/floater_world_map.xml | 9 +- linden/indra/newview/skins/xui/ko/need_to_long.xml | 187 +- .../newview/skins/xui/ko/need_to_translate.xml | 2513 +++++++------------ .../indra/newview/skins/xui/ko/need_to_update.xml | 398 +-- linden/indra/newview/skins/xui/ko/notify.xml | 15 + .../skins/xui/ko/panel_avatar_classified.xml | 12 +- .../newview/skins/xui/ko/panel_classified.xml | 12 +- .../newview/skins/xui/ko/panel_group_general.xml | 12 + .../newview/skins/xui/ko/panel_group_notices.xml | 1 + linden/indra/newview/skins/xui/ko/panel_login.xml | 2 +- .../skins/xui/ko/panel_preferences_graphics1.xml | 20 + .../newview/skins/xui/ko/panel_preferences_web.xml | 6 +- .../newview/skins/xui/ko/panel_region_general.xml | 6 + linden/indra/newview/skins/xui/ko/strings.xml | 390 +++ linden/indra/newview/viewer_manifest.py | 1 + 117 files changed, 5975 insertions(+), 6836 deletions(-) create mode 100644 linden/indra/newview/skins/xui/de/strings.xml create mode 100644 linden/indra/newview/skins/xui/ja/strings.xml create mode 100644 linden/indra/newview/skins/xui/ko/strings.xml (limited to 'linden/indra/newview') diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml index f5e57a5..b93f826 100644 --- a/linden/indra/newview/app_settings/settings.xml +++ b/linden/indra/newview/app_settings/settings.xml @@ -1910,17 +1910,6 @@ Value 1 - CrashLogBehavior - - Comment - Controls behavior when viewer (0 = ask before sending crash report, 1 = always send crash report, 2 = never send crash report) - Persist - 0 - Type - S32 - Value - 1 - CreateToolCopyCenters Comment @@ -2419,7 +2408,7 @@ Type F32 Value - 10.0 + 60.0 FilterItemsPerFrame @@ -4445,7 +4434,7 @@ Type F32 Value - 10.0 + 20.0 MapOverlayIndex @@ -4623,6 +4612,17 @@ Value 0 + MemoryLogFrequency + + Comment + Seconds between display of Memory in log (0 for never) + Persist + 1 + Type + F32 + Value + 600.0 + MenuAccessKeyTime Comment @@ -6941,7 +6941,7 @@ Type Boolean Value - 1 + 0 ShowMovementControls diff --git a/linden/indra/newview/llappviewer.cpp b/linden/indra/newview/llappviewer.cpp index a461dcb..f39610f 100644 --- a/linden/indra/newview/llappviewer.cpp +++ b/linden/indra/newview/llappviewer.cpp @@ -269,6 +269,7 @@ BOOL gUseWireframe = FALSE; LLVFS* gStaticVFS = NULL; LLMemoryInfo gSysMemory; +U64 gMemoryAllocated = 0; // updated in display_stats() in llviewerdisplay.cpp LLString gLastVersionChannel; @@ -285,6 +286,7 @@ BOOL gPeriodicSlowFrame = FALSE; BOOL gCrashOnStartup = FALSE; BOOL gLLErrorActivated = FALSE; BOOL gLogoutInProgress = FALSE; + //////////////////////////////////////////////////////////// // Internal globals... that should be removed. static LLString gArgs; @@ -320,6 +322,48 @@ void idle_afk_check() } } +//this function checks if the system can allocate (num_chunk)MB memory successfully. +//if this check fails, the allocated memory is NOT freed. +void idle_mem_check(S32 num_chunk) +{ + //this flag signals if memory allocation check is necessary + static BOOL check = TRUE ; + + if(!check) //if memory check fails before, do not repeat it. + { + return ; + } + check = FALSE ; //before memory check for this frame, turn off check signal for the next frame. + + S32 i = 0 ; + char**p = new char*[num_chunk] ; + if(!p) + { + return ; + } + for(i = 0 ; i < num_chunk ; i++) + { + //1MB per chunk + //if the allocation fails, the system should catch it. + p[i] = new char[1024 * 1024] ; + + if(!p[i]) //in case that system try-catch is turned off + { + return ; + } + } + + //release memory if the allocation check does not fail. + for(i = 0 ; i < num_chunk ; i++) + { + delete[] p[i] ; + } + delete[] p ; + + //memory check for this frame succeeds, turn on next frame check. + check = TRUE ; +} + // A callback set in LLAppViewer::init() static void ui_audio_callback(const LLUUID& uuid) { @@ -351,6 +395,24 @@ void request_initial_instant_messages() } } +// A settings system callback for CrashSubmitBehavior +bool handleCrashSubmitBehaviorChanged(const LLSD& newvalue) +{ + S32 cb = newvalue.asInteger(); + const S32 NEVER_SUBMIT_REPORT = 2; + if(cb == NEVER_SUBMIT_REPORT) + { + // LLWatchdog::getInstance()->cleanup(); // SJB: cleaning up a running watchdog is unsafe + LLAppViewer::instance()->destroyMainloopTimeout(); + } + else if(gSavedSettings.getBOOL("WatchdogEnabled") == TRUE) + { +// LLWatchdog::getInstance()->init(); +// LLAppViewer::instance()->initMainloopTimeout("Mainloop Resume"); + } + return true; +} + // Use these strictly for things that are constructed at startup, // or for things that are performance critical. JC static void settings_to_globals() @@ -457,9 +519,8 @@ void LLAppViewer::initGridChoice() std::string grid_choice = gSavedSettings.getString("CmdLineGridChoice"); LLViewerLogin::getInstance()->setGridChoice(grid_choice); -#if !LL_RELEASE_FOR_DOWNLOAD - // Development version: load last server choice by default - // ignored is the command line grid choice has been set + // Load last server choice by default + // ignored if the command line grid choice has been set if(grid_choice.empty()) { S32 server = gSavedSettings.getS32("ServerChoice"); @@ -474,7 +535,6 @@ void LLAppViewer::initGridChoice() LLViewerLogin::getInstance()->setGridChoice((EGridInfo)server); } } -#endif } bool send_url_to_other_instance(const std::string& url) @@ -521,7 +581,6 @@ LLTextureFetch* LLAppViewer::sTextureFetch = NULL; LLAppViewer::LLAppViewer() : mMarkerFile(NULL), - mCrashBehavior(CRASH_BEHAVIOR_ASK), mReportedCrash(false), mNumSessions(0), mPurgeCache(false), @@ -543,12 +602,7 @@ LLAppViewer::LLAppViewer() : LLAppViewer::~LLAppViewer() { - if(mMainloopTimeout) - { - // delete the mainloop timeout. - delete mMainloopTimeout; - mMainloopTimeout = NULL; - } + destroyMainloopTimeout(); // If we got to this destructor somehow, the app didn't hang. removeMarkerFile(); @@ -860,6 +914,8 @@ bool LLAppViewer::mainLoop() { LLFastTimer t(LLFastTimer::FTM_FRAME); + pingMainloopTimeout("Main:GatherInput"); + { LLFastTimer t2(LLFastTimer::FTM_MESSAGES); #if LL_WINDOWS @@ -880,8 +936,13 @@ bool LLAppViewer::mainLoop() } #endif + //at the beginning of every frame, check if the system can successfully allocate 10 * 1 MB memory. + idle_mem_check(10) ; + if (!LLApp::isExiting()) { + pingMainloopTimeout("Main:JoystickKeyboard"); + // Scan keyboard for movement keys. Command keys and typing // are handled by windows callbacks. Don't do this until we're // done initializing. JC @@ -896,6 +957,8 @@ bool LLAppViewer::mainLoop() gKeyboard->scanKeyboard(); } + pingMainloopTimeout("Main:Messages"); + // Update state based on messages, user input, object idle. { LLFastTimer t3(LLFastTimer::FTM_IDLE); @@ -912,25 +975,32 @@ bool LLAppViewer::mainLoop() if (gDoDisconnect && (LLStartUp::getStartupState() == STATE_STARTED)) { + pauseMainloopTimeout(); saveFinalSnapshot(); disconnectViewer(); + resumeMainloopTimeout(); } // Render scene. if (!LLApp::isExiting()) { + pingMainloopTimeout("Main:Display"); display(); + pingMainloopTimeout("Main:Snapshot"); LLFloaterSnapshot::update(); // take snapshots #if LL_WINDOWS && LL_LCD_COMPILE // update LCD Screen + pingMainloopTimeout("Main:LCD"); gLcdScreen->UpdateDisplay(); #endif } } + pingMainloopTimeout("Main:Sleep"); + pauseMainloopTimeout(); // Sleep and run background threads @@ -1017,7 +1087,7 @@ bool LLAppViewer::mainLoop() resumeMainloopTimeout(); - pingMainloopTimeout("Mainloop"); + pingMainloopTimeout("Main:End"); } } @@ -1042,11 +1112,7 @@ bool LLAppViewer::mainLoop() delete gServicePump; - if(mMainloopTimeout) - { - delete mMainloopTimeout; - mMainloopTimeout = NULL; - } + destroyMainloopTimeout(); llinfos << "Exiting main_loop" << llendflush; @@ -1350,7 +1416,7 @@ bool LLAppViewer::initThreads() const S32 NEVER_SUBMIT_REPORT = 2; if(TRUE == gSavedSettings.getBOOL("WatchdogEnabled") - && (gCrashSettings.getS32("CrashSubmitBehavior") != NEVER_SUBMIT_REPORT)) + && (gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) != NEVER_SUBMIT_REPORT)) { LLWatchdog::getInstance()->init(); } @@ -1512,10 +1578,16 @@ bool LLAppViewer::initConfiguration() //*FIX:Mani - Set default to disabling watchdog mainloop // timeout for mac and linux. There is no call stack info // on these platform to help debug. +#ifndef LL_RELEASE_FOR_DOWNLOAD + gSavedSettings.setBOOL("WatchdogEnabled", FALSE); +#endif + #ifndef LL_WINDOWS gSavedSettings.setBOOL("WatchdogEnabled", FALSE); #endif + gCrashSettings.getControl(CRASH_BEHAVIOR_SETTING)->getSignal()->connect(boost::bind(&handleCrashSubmitBehaviorChanged, _1)); + // These are warnings that appear on the first experience of that condition. // They are already set in the settings_default.xml file, but still need to be added to LLFirstUse // for disable/reset ability @@ -2153,9 +2225,10 @@ void LLAppViewer::writeSystemInfo() gDebugInfo["CPUInfo"]["CPUSSE"] = gSysCPU.hasSSE(); gDebugInfo["CPUInfo"]["CPUSSE2"] = gSysCPU.hasSSE2(); - gDebugInfo["RAMInfo"] = llformat("%u", gSysMemory.getPhysicalMemoryKB()); + gDebugInfo["RAMInfo"]["Physical"] = (LLSD::Integer)(gSysMemory.getPhysicalMemoryKB()); + gDebugInfo["RAMInfo"]["Allocated"] = (LLSD::Integer)(gMemoryAllocated>>10); // MB -> KB gDebugInfo["OSInfo"] = getOSInfo().getOSStringSimple(); - + // *FIX:Mani - move this ddown in llappviewerwin32 #ifdef LL_WINDOWS DWORD thread_id = GetCurrentThreadId(); @@ -2191,7 +2264,10 @@ void LLAppViewer::handleSyncViewerCrash() void LLAppViewer::handleViewerCrash() { llinfos << "Handle viewer crash entry." << llendl; - + + // Make sure the watchdog gets turned off... +// LLWatchdog::getInstance()->cleanup(); // SJB: This causes the Watchdog to hang for an extra 20-40s?! + LLAppViewer* pApp = LLAppViewer::instance(); if (pApp->beingDebugged()) { @@ -2315,12 +2391,6 @@ void LLAppViewer::handleViewerCrash() return; } -void LLAppViewer::setCrashBehavior(S32 cb) -{ - mCrashBehavior = cb; - gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, mCrashBehavior); -} - bool LLAppViewer::anotherInstanceRunning() { // We create a marker file when the program starts and remove the file when it finishes. @@ -3618,6 +3688,15 @@ void LLAppViewer::initMainloopTimeout(const std::string& state, F32 secs) } } +void LLAppViewer::destroyMainloopTimeout() +{ + if(mMainloopTimeout) + { + delete mMainloopTimeout; + mMainloopTimeout = NULL; + } +} + void LLAppViewer::resumeMainloopTimeout(const std::string& state, F32 secs) { if(mMainloopTimeout) diff --git a/linden/indra/newview/llappviewer.h b/linden/indra/newview/llappviewer.h index 9f9deb6..02406be 100644 --- a/linden/indra/newview/llappviewer.h +++ b/linden/indra/newview/llappviewer.h @@ -77,8 +77,6 @@ public: // Report true if under the control of a debugger. A null-op default. virtual bool beingDebugged() { return false; } - S32 getCrashBehavior() const { return mCrashBehavior; } - void setCrashBehavior(S32 cb); virtual void handleCrashReporting() = 0; // What to do with crash report? virtual void handleSyncCrashTrace() = 0; // any low-level crash-prep that has to happen in the context of the crashing thread before the crash report is delivered. static void handleViewerCrash(); // Hey! The viewer crashed. Do this, soon. @@ -132,6 +130,7 @@ public: // llstartup needs to control init. // llworld, send_agent_pause() also controls pause/resume. void initMainloopTimeout(const std::string& state, F32 secs = -1.0f); + void destroyMainloopTimeout(); void pauseMainloopTimeout(); void resumeMainloopTimeout(const std::string& state = "", F32 secs = -1.0f); void pingMainloopTimeout(const std::string& state, F32 secs = -1.0f); @@ -186,7 +185,6 @@ private: LLOSInfo mSysOSInfo; - S32 mCrashBehavior; bool mReportedCrash; // Thread objects. @@ -287,6 +285,7 @@ extern BOOL gUseWireframe; extern LLVFS *gStaticVFS; extern LLMemoryInfo gSysMemory; +extern U64 gMemoryAllocated; extern LLString gLastVersionChannel; diff --git a/linden/indra/newview/llappviewerlinux.cpp b/linden/indra/newview/llappviewerlinux.cpp index e41c505..5537687 100644 --- a/linden/indra/newview/llappviewerlinux.cpp +++ b/linden/indra/newview/llappviewerlinux.cpp @@ -333,13 +333,15 @@ void LLAppViewerLinux::handleSyncCrashTrace() void LLAppViewerLinux::handleCrashReporting() { + const S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING); + // Always generate the report, have the logger do the asking, and // don't wait for the logger before exiting (-> total cleanup). - if (CRASH_BEHAVIOR_NEVER_SEND != LLAppViewer::instance()->getCrashBehavior()) + if (CRASH_BEHAVIOR_NEVER_SEND != cb) { // launch the actual crash logger char* ask_dialog = "-dialog"; - if (CRASH_BEHAVIOR_ASK != LLAppViewer::instance()->getCrashBehavior()) + if (CRASH_BEHAVIOR_ASK != cb) ask_dialog = ""; // omit '-dialog' option std::string cmd =gDirUtilp->getAppRODataDir(); cmd += gDirUtilp->getDirDelimiter(); diff --git a/linden/indra/newview/llappviewerwin32.cpp b/linden/indra/newview/llappviewerwin32.cpp index 59883e5..e90887e 100644 --- a/linden/indra/newview/llappviewerwin32.cpp +++ b/linden/indra/newview/llappviewerwin32.cpp @@ -421,8 +421,9 @@ void LLAppViewerWin32::handleCrashReporting() std::string arg_string = "-user "; arg_string += LLViewerLogin::getInstance()->getGridLabel(); - - switch(getCrashBehavior()) + + S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING); + switch(cb) { case CRASH_BEHAVIOR_ASK: default: diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp index bbbdb93..f5aba70 100644 --- a/linden/indra/newview/llchatbar.cpp +++ b/linden/indra/newview/llchatbar.cpp @@ -382,6 +382,7 @@ void LLChatBar::sendChat( EChatType type ) LLWString text; if (mInputEditor) text = mInputEditor->getWText(); LLWString::trim(text); + LLWString::replaceChar(text,182,'\n'); // Convert paragraph symbols back into newlines. if (!text.empty()) { diff --git a/linden/indra/newview/lldrawable.cpp b/linden/indra/newview/lldrawable.cpp index ba7d6b9..db57509 100644 --- a/linden/indra/newview/lldrawable.cpp +++ b/linden/indra/newview/lldrawable.cpp @@ -122,6 +122,7 @@ void LLDrawable::destroy() sNumZombieDrawables--; } + LLFace::sDeleteLock = mFaces.size() ; std::for_each(mFaces.begin(), mFaces.end(), DeletePointer()); mFaces.clear(); @@ -184,6 +185,7 @@ void LLDrawable::cleanupReferences() { LLFastTimer t(LLFastTimer::FTM_PIPELINE); + LLFace::sDeleteLock = mFaces.size() ; std::for_each(mFaces.begin(), mFaces.end(), DeletePointer()); mFaces.clear(); @@ -277,6 +279,7 @@ void LLDrawable::setNumFaces(const S32 newFaces, LLFacePool *poolp, LLViewerImag } else if (newFaces < (S32)mFaces.size()) { + LLFace::sDeleteLock = (S32)mFaces.size() - newFaces ; std::for_each(mFaces.begin() + newFaces, mFaces.end(), DeletePointer()); mFaces.erase(mFaces.begin() + newFaces, mFaces.end()); } @@ -288,6 +291,8 @@ void LLDrawable::setNumFaces(const S32 newFaces, LLFacePool *poolp, LLViewerImag addFace(poolp, texturep); } } + + llassert_always(mFaces.size() == newFaces); } void LLDrawable::setNumFacesFast(const S32 newFaces, LLFacePool *poolp, LLViewerImage *texturep) @@ -298,6 +303,7 @@ void LLDrawable::setNumFacesFast(const S32 newFaces, LLFacePool *poolp, LLViewer } else if (newFaces < (S32)mFaces.size()) { + LLFace::sDeleteLock = (S32)mFaces.size() - newFaces ; std::for_each(mFaces.begin() + newFaces, mFaces.end(), DeletePointer()); mFaces.erase(mFaces.begin() + newFaces, mFaces.end()); } @@ -309,6 +315,8 @@ void LLDrawable::setNumFacesFast(const S32 newFaces, LLFacePool *poolp, LLViewer addFace(poolp, texturep); } } + + llassert_always(mFaces.size() == newFaces) ; } void LLDrawable::mergeFaces(LLDrawable* src) @@ -329,8 +337,13 @@ void LLDrawable::deleteFaces(S32 offset, S32 count) { face_list_t::iterator face_begin = mFaces.begin() + offset; face_list_t::iterator face_end = face_begin + count; + + S32 end = (S32)mFaces.size() ; + LLFace::sDeleteLock = count ; std::for_each(face_begin, face_end, DeletePointer()); mFaces.erase(face_begin, face_end); + + llassert_always(mFaces.size() == end - count) ; } void LLDrawable::update() diff --git a/linden/indra/newview/lldrawpoolalpha.cpp b/linden/indra/newview/lldrawpoolalpha.cpp index ca8f3b4..efe774f 100644 --- a/linden/indra/newview/lldrawpoolalpha.cpp +++ b/linden/indra/newview/lldrawpoolalpha.cpp @@ -230,6 +230,7 @@ void LLDrawPoolAlpha::renderGroupAlpha(LLSpatialGroup* group, U32 type, U32 mask if (texture && params.mTexture.notNull()) { + llassert_always(gGL.getTexUnit(0)) ; gGL.getTexUnit(0)->activate(); params.mTexture->bind(); params.mTexture->addTextureStats(params.mVSize); diff --git a/linden/indra/newview/lldrawpoolbump.cpp b/linden/indra/newview/lldrawpoolbump.cpp index 303b8d5..c7c19d9 100644 --- a/linden/indra/newview/lldrawpoolbump.cpp +++ b/linden/indra/newview/lldrawpoolbump.cpp @@ -607,6 +607,10 @@ BOOL LLDrawPoolBump::bindBumpMap(LLDrawInfo& params) if( tex ) { bump = gBumpImageList.getBrightnessDarknessImage( tex, bump_code ); + //------------------------------------------ + //error check to make sure bump is valid + llassert_always(!bump || bump->getNumRefs() == 1) ; + //------------------------------------------ } break; @@ -621,6 +625,11 @@ BOOL LLDrawPoolBump::bindBumpMap(LLDrawInfo& params) if (bump) { + //------------------------------------------ + //error check to make sure bump is valid + llassert_always(bump->getNumRefs() > 0 && bump->getNumRefs() < 100000) ; + //------------------------------------------ + bump->bind(1); bump->bind(0); return TRUE; @@ -863,9 +872,15 @@ LLImageGL* LLBumpImageList::getBrightnessDarknessImage(LLViewerImage* src_image, { LLPointer raw = new LLImageRaw(1,1,1); raw->clear(0x77, 0x77, 0x77, 0xFF); + + //------------------------------ bump = new LLImageGL( raw, TRUE); - bump->setExplicitFormat(GL_ALPHA8, GL_ALPHA); + //immediately assign bump to a global smart pointer in case some local smart pointer + //accidently releases it. (*entries_list)[src_image->getID()] = bump; + //------------------------------ + + bump->setExplicitFormat(GL_ALPHA8, GL_ALPHA); // Note: this may create an LLImageGL immediately src_image->setLoadedCallback( callback_func, 0, TRUE, new LLUUID(src_image->getID()) ); @@ -1020,10 +1035,15 @@ void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerImage *src_vi, LLIma } } + //--------------------------------------------------- LLImageGL* bump = new LLImageGL( TRUE); - bump->setExplicitFormat(GL_ALPHA8, GL_ALPHA); - bump->createGLTexture(0, dst_image); + //immediately assign bump to a global smart pointer in case some local smart pointer + //accidently releases it. iter->second = bump; // derefs (and deletes) old image + //--------------------------------------------------- + + bump->setExplicitFormat(GL_ALPHA8, GL_ALPHA); + bump->createGLTexture(0, dst_image); } else { diff --git a/linden/indra/newview/lldynamictexture.cpp b/linden/indra/newview/lldynamictexture.cpp index f77187d..a724d88 100644 --- a/linden/indra/newview/lldynamictexture.cpp +++ b/linden/indra/newview/lldynamictexture.cpp @@ -42,8 +42,6 @@ #include "llviewerdisplay.h" #include "llrender.h" -void render_ui_and_swap_if_needed(); - // static LLDynamicTexture::instance_list_t LLDynamicTexture::sInstances[ LLDynamicTexture::ORDER_COUNT ]; S32 LLDynamicTexture::sNumRenders = 0; @@ -219,9 +217,8 @@ BOOL LLDynamicTexture::updateAllInstances() LLDynamicTexture *dynamicTexture = *iter; if (dynamicTexture->needsRender()) { - render_ui_and_swap_if_needed(); glClear(GL_DEPTH_BUFFER_BIT); - gDisplaySwapBuffers = FALSE; + gDepthDirty = TRUE; gGL.color4f(1,1,1,1); diff --git a/linden/indra/newview/llface.cpp b/linden/indra/newview/llface.cpp index 3e0c5b2..77251ce 100644 --- a/linden/indra/newview/llface.cpp +++ b/linden/indra/newview/llface.cpp @@ -57,6 +57,7 @@ extern BOOL gPickFaces; BOOL LLFace::sSafeRenderSelect = TRUE; // FALSE +S32 LLFace::sDeleteLock = 0 ; #define DOTVEC(a,b) (a.mV[0]*b.mV[0] + a.mV[1]*b.mV[1] + a.mV[2]*b.mV[2]) @@ -177,6 +178,9 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp) void LLFace::destroy() { + llassert_always(sDeleteLock >= 1); + --sDeleteLock; + mDrawablep = NULL; mVObjp = NULL; diff --git a/linden/indra/newview/llface.h b/linden/indra/newview/llface.h index 533851c..35063a0 100644 --- a/linden/indra/newview/llface.h +++ b/linden/indra/newview/llface.h @@ -296,6 +296,9 @@ public: lhs->getTexture() < rhs->getTexture(); } }; + +public://paranoia check only + static S32 sDeleteLock ; }; #endif // LL_LLFACE_H diff --git a/linden/indra/newview/llfirstuse.cpp b/linden/indra/newview/llfirstuse.cpp index e6dee2c..b3d383d 100644 --- a/linden/indra/newview/llfirstuse.cpp +++ b/linden/indra/newview/llfirstuse.cpp @@ -37,6 +37,7 @@ #include "indra_constants.h" // viewer includes +#include "llagent.h" // for gAgent.inPrelude() #include "llnotify.h" #include "llviewercontrol.h" #include "llui.h" @@ -107,12 +108,14 @@ void LLFirstUse::useBalanceDecrease(S32 delta) // static void LLFirstUse::useSit() { - if (gSavedSettings.getWarning("FirstSit")) - { - gSavedSettings.setWarning("FirstSit", FALSE); - - LLNotifyBox::showXml("FirstSit"); - } + // Our orientation island uses sitting to teach vehicle driving + // so just never show this message. JC + //if (gSavedSettings.getWarning("FirstSit")) + //{ + // gSavedSettings.setWarning("FirstSit", FALSE); + + // LLNotifyBox::showXml("FirstSit"); + //} } // static @@ -168,11 +171,16 @@ void LLFirstUse::useTeleport() // static void LLFirstUse::useOverrideKeys() { - if (gSavedSettings.getWarning("FirstOverrideKeys")) + // Our orientation island uses key overrides to teach vehicle driving + // so don't show this message until you get off OI. JC + if (!gAgent.inPrelude()) { - gSavedSettings.setWarning("FirstOverrideKeys", FALSE); + if (gSavedSettings.getWarning("FirstOverrideKeys")) + { + gSavedSettings.setWarning("FirstOverrideKeys", FALSE); - LLNotifyBox::showXml("FirstOverrideKeys"); + LLNotifyBox::showXml("FirstOverrideKeys"); + } } } diff --git a/linden/indra/newview/llflexibleobject.cpp b/linden/indra/newview/llflexibleobject.cpp index ec49c1a..95e6d17 100644 --- a/linden/indra/newview/llflexibleobject.cpp +++ b/linden/indra/newview/llflexibleobject.cpp @@ -305,7 +305,7 @@ BOOL LLVolumeImplFlexible::doIdleUpdate(LLAgent &agent, LLWorld &world, const F6 new_res = mRenderRes; } - if (!mInitialized) + if (!mInitialized || (mSimulateRes != new_res)) { mSimulateRes = new_res; setAttributesOfAllSections(); diff --git a/linden/indra/newview/llfloateranimpreview.cpp b/linden/indra/newview/llfloateranimpreview.cpp index 82729e9..ca6982b 100644 --- a/linden/indra/newview/llfloateranimpreview.cpp +++ b/linden/indra/newview/llfloateranimpreview.cpp @@ -1037,7 +1037,7 @@ LLPreviewAnimation::LLPreviewAnimation(S32 width, S32 height) : LLDynamicTexture mDummyAvatar = (LLVOAvatar*)gObjectList.createObjectViewer(LL_PCODE_LEGACY_AVATAR, gAgent.getRegion()); mDummyAvatar->createDrawable(&gPipeline); mDummyAvatar->mIsDummy = TRUE; - mDummyAvatar->mSpecialRenderMode = 1; + mDummyAvatar->mSpecialRenderMode = 2; mDummyAvatar->setPositionAgent(LLVector3::zero); mDummyAvatar->slamPosition(); mDummyAvatar->updateJointLODs(); diff --git a/linden/indra/newview/llfloateravatarinfo.cpp b/linden/indra/newview/llfloateravatarinfo.cpp index 942a394..d4b0b1c 100644 --- a/linden/indra/newview/llfloateravatarinfo.cpp +++ b/linden/indra/newview/llfloateravatarinfo.cpp @@ -120,6 +120,7 @@ LLFloaterAvatarInfo::LLFloaterAvatarInfo(const std::string& name, const LLRect & mPanelAvatarp->selectTab(0); } + llassert_always(!gAvatarInfoInstances.checkData(mAvatarID));//if not inserted. gAvatarInfoInstances.addData(avatar_id, this); @@ -128,8 +129,12 @@ LLFloaterAvatarInfo::LLFloaterAvatarInfo(const std::string& name, const LLRect & // virtual LLFloaterAvatarInfo::~LLFloaterAvatarInfo() { + llassert_always(gAvatarInfoInstances.checkData(mAvatarID));//if there + llinfos << "to remove profile floater for avatar " << mAvatarID << llendl ; // child views automatically deleted gAvatarInfoInstances.removeData(mAvatarID); + + llinfos << "successfully removed profile floater for avatar " << mAvatarID << llendl ; } diff --git a/linden/indra/newview/llfloaterchat.cpp b/linden/indra/newview/llfloaterchat.cpp index d05b231..383a33e 100644 --- a/linden/indra/newview/llfloaterchat.cpp +++ b/linden/indra/newview/llfloaterchat.cpp @@ -207,7 +207,8 @@ void add_timestamped_line(LLViewerTextEditor* edit, const LLChat &chat, const LL { line = line.substr(chat.mFromName.length()); const LLStyleSP &sourceStyle = LLStyleMap::instance().lookup(chat.mFromID); - edit->appendStyledText(chat.mFromName, false, false, &sourceStyle); + edit->appendStyledText(chat.mFromName, false, prepend_newline, &sourceStyle); + prepend_newline = false; } edit->appendColoredText(line, false, prepend_newline, color); } diff --git a/linden/indra/newview/llfloaterreporter.cpp b/linden/indra/newview/llfloaterreporter.cpp index 9c43f35..49c6e83 100644 --- a/linden/indra/newview/llfloaterreporter.cpp +++ b/linden/indra/newview/llfloaterreporter.cpp @@ -898,7 +898,7 @@ void LLFloaterReporter::takeScreenshot() mResourceDatap->mAssetInfo.mType); // store in the image list so it doesn't try to fetch from the server - LLViewerImage* image_in_list = new LLViewerImage(mResourceDatap->mAssetInfo.mUuid, TRUE); + LLPointer image_in_list = new LLViewerImage(mResourceDatap->mAssetInfo.mUuid, TRUE); image_in_list->createGLTexture(0, raw); gImageList.addImage(image_in_list); diff --git a/linden/indra/newview/llfloatertos.cpp b/linden/indra/newview/llfloatertos.cpp index 920ef4c..e4073f1 100644 --- a/linden/indra/newview/llfloatertos.cpp +++ b/linden/indra/newview/llfloatertos.cpp @@ -215,7 +215,7 @@ LLFloaterTOS::~LLFloaterTOS() LLWebBrowserCtrl* web_browser = getChild("tos_html"); if ( web_browser ) { - web_browser->addObserver( this ); + web_browser->remObserver( this ); }; // tell the responder we're not here anymore diff --git a/linden/indra/newview/llfloaterworldmap.cpp b/linden/indra/newview/llfloaterworldmap.cpp index 75fbff2..e8b6caa 100644 --- a/linden/indra/newview/llfloaterworldmap.cpp +++ b/linden/indra/newview/llfloaterworldmap.cpp @@ -871,6 +871,8 @@ void LLFloaterWorldMap::buildLandmarkIDLists() { list->selectItemRange(1, -1); list->operateOnSelection(LLCtrlListInterface::OP_DELETE); + + llassert_always(list->getItemCount() == 1) ; } mLandmarkItemIDList.reset(); diff --git a/linden/indra/newview/llfolderview.cpp b/linden/indra/newview/llfolderview.cpp index b543e31..4833c12 100644 --- a/linden/indra/newview/llfolderview.cpp +++ b/linden/indra/newview/llfolderview.cpp @@ -349,10 +349,10 @@ void LLFolderViewItem::arrangeFromRoot() // UI. If open is TRUE, then folders are opened up along the way to // the selection. void LLFolderViewItem::setSelectionFromRoot(LLFolderViewItem* selection, - BOOL open, /* Flawfinder: ignore */ + BOOL openitem, BOOL take_keyboard_focus) { - getRoot()->setSelection(selection, open, take_keyboard_focus); /* Flawfinder: ignore */ + getRoot()->setSelection(selection, openitem, take_keyboard_focus); } // helper function to change the selection from the root. @@ -368,7 +368,7 @@ void LLFolderViewItem::extendSelectionFromRoot(LLFolderViewItem* selection) getRoot()->extendSelection(selection, NULL, selected_items); } -EInventorySortGroup LLFolderViewItem::getSortGroup() +EInventorySortGroup LLFolderViewItem::getSortGroup() const { return SG_ITEM; } @@ -442,7 +442,7 @@ void LLFolderViewItem::dirtyFilter() // means 'deselect' for a leaf item. Do this optimization after // multiple selection is implemented to make sure it all plays nice // together. -BOOL LLFolderViewItem::setSelection(LLFolderViewItem* selection, BOOL open, BOOL take_keyboard_focus) +BOOL LLFolderViewItem::setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus) { if( selection == this ) { @@ -548,7 +548,7 @@ void LLFolderViewItem::buildContextMenu(LLMenuGL& menu, U32 flags) } } -void LLFolderViewItem::open( void ) /* Flawfinder: ignore */ +void LLFolderViewItem::openItem( void ) { if( mListener ) { @@ -989,9 +989,6 @@ LLFolderViewFolder::LLFolderViewFolder( const LLString& name, LLUIImagePtr icon, mMostFilteredDescendantGeneration(-1) { mType = "(folder)"; - - //mItems.setInsertBefore( &sort_item_name ); - //mFolders.setInsertBefore( &folder_insert_before ); } // Destroys the object @@ -1000,10 +997,6 @@ LLFolderViewFolder::~LLFolderViewFolder( void ) // The LLView base class takes care of object destruction. make sure that we // don't have mouse or keyboard focus gFocusMgr.releaseFocusIfNeeded( this ); // calls onCommit() - - //mItems.reset(); - //mItems.removeAllNodes(); - //mFolders.removeAllNodes(); } // addToFolder() returns TRUE if it succeeds. FALSE otherwise @@ -1048,9 +1041,7 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation) // Add sizes of children S32 parent_item_height = getRect().getHeight(); - folders_t::iterator fit = mFolders.begin(); - folders_t::iterator fend = mFolders.end(); - for(; fit < fend; ++fit) + for(folders_t::iterator fit = mFolders.begin(); fit != mFolders.end(); ++fit) { LLFolderViewFolder* folderp = (*fit); if (getRoot()->getDebugFilters()) @@ -1076,9 +1067,8 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation) folderp->setOrigin( 0, child_top - folderp->getRect().getHeight() ); } } - items_t::iterator iit = mItems.begin(); - items_t::iterator iend = mItems.end(); - for(;iit < iend; ++iit) + for(items_t::iterator iit = mItems.begin(); + iit != mItems.end(); ++iit) { LLFolderViewItem* itemp = (*iit); if (getRoot()->getDebugFilters()) @@ -1354,7 +1344,7 @@ BOOL LLFolderViewFolder::hasFilteredDescendants() // Passes selection information on to children and record selection // information if necessary. -BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL open, /* Flawfinder: ignore */ +BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus) { BOOL rv = FALSE; @@ -1378,7 +1368,7 @@ BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL open, / iter != mFolders.end();) { folders_t::iterator fit = iter++; - if((*fit)->setSelection(selection, open, take_keyboard_focus)) /* Flawfinder: ignore */ + if((*fit)->setSelection(selection, openitem, take_keyboard_focus)) { rv = TRUE; child_selected = TRUE; @@ -1389,14 +1379,14 @@ BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL open, / iter != mItems.end();) { items_t::iterator iit = iter++; - if((*iit)->setSelection(selection, open, take_keyboard_focus)) /* Flawfinder: ignore */ + if((*iit)->setSelection(selection, openitem, take_keyboard_focus)) { rv = TRUE; child_selected = TRUE; mNumDescendantsSelected++; } } - if(open && child_selected) /* Flawfinder: ignore */ + if(openitem && child_selected) { setOpenArrangeRecursively(TRUE); } @@ -1636,11 +1626,9 @@ void LLFolderViewFolder::destroyView() while (!mFolders.empty()) { LLFolderViewFolder *folderp = mFolders.back(); - folderp->destroyView(); + folderp->destroyView(); // removes entry from mFolders } - mFolders.clear(); - deleteAllChildren(); if (mParentFolder) @@ -1711,11 +1699,11 @@ void LLFolderViewFolder::extractItem( LLFolderViewItem* item ) // This is only called for renaming an object because it won't work for date void LLFolderViewFolder::resort(LLFolderViewItem* item) { - std::sort(mItems.begin(), mItems.end(), mSortFunction); - std::sort(mFolders.begin(), mFolders.end(), mSortFunction); + mItems.sort(mSortFunction); + mFolders.sort(mSortFunction); } -bool LLFolderViewFolder::isTrash() +bool LLFolderViewFolder::isTrash() const { if (mAmTrash == LLFolderViewFolder::UNKNOWN) { @@ -1740,8 +1728,8 @@ void LLFolderViewFolder::sortBy(U32 order) (*fit)->sortBy(order); } - std::sort(mFolders.begin(), mFolders.end(), mSortFunction); - std::sort(mItems.begin(), mItems.end(), mSortFunction); + mFolders.sort(mSortFunction); + mItems.sort(mSortFunction); if (order & LLInventoryFilter::SO_DATE) { @@ -1776,12 +1764,12 @@ void LLFolderViewFolder::setItemSortOrder(U32 ordering) (*fit)->setItemSortOrder(ordering); } - std::sort(mFolders.begin(), mFolders.end(), mSortFunction); - std::sort(mItems.begin(), mItems.end(), mSortFunction); + mFolders.sort(mSortFunction); + mItems.sort(mSortFunction); } } -EInventorySortGroup LLFolderViewFolder::getSortGroup() +EInventorySortGroup LLFolderViewFolder::getSortGroup() const { if (isTrash()) { @@ -1928,16 +1916,16 @@ void LLFolderViewFolder::toggleOpen() } // Force a folder open or closed -void LLFolderViewFolder::setOpen(BOOL open) /* Flawfinder: ignore */ +void LLFolderViewFolder::setOpen(BOOL openitem) { - setOpenArrangeRecursively(open); /* Flawfinder: ignore */ + setOpenArrangeRecursively(openitem); } -void LLFolderViewFolder::setOpenArrangeRecursively(BOOL open, ERecurseType recurse) /* Flawfinder: ignore */ +void LLFolderViewFolder::setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse) { BOOL was_open = mIsOpen; - mIsOpen = open; /* Flawfinder: ignore */ - if(!was_open && open) /* Flawfinder: ignore */ + mIsOpen = openitem; + if(!was_open && openitem) { if(mListener) { @@ -1951,12 +1939,12 @@ void LLFolderViewFolder::setOpenArrangeRecursively(BOOL open, ERecurseType recur iter != mFolders.end();) { folders_t::iterator fit = iter++; - (*fit)->setOpenArrangeRecursively(open, RECURSE_DOWN); /* Flawfinder: ignore */ + (*fit)->setOpenArrangeRecursively(openitem, RECURSE_DOWN); /* Flawfinder: ignore */ } } if (mParentFolder && (recurse == RECURSE_UP || recurse == RECURSE_UP_DOWN)) { - mParentFolder->setOpenArrangeRecursively(open, RECURSE_UP); /* Flawfinder: ignore */ + mParentFolder->setOpenArrangeRecursively(openitem, RECURSE_UP); } if (was_open != mIsOpen) @@ -1989,7 +1977,7 @@ BOOL LLFolderViewFolder::handleDragAndDropFromChild(MASK mask, return TRUE; } -void LLFolderViewFolder::open( void ) /* Flawfinder: ignore */ +void LLFolderViewFolder::openItem( void ) { toggleOpen(); } @@ -2687,10 +2675,10 @@ void LLFolderView::openFolder(const LLString& foldername) } } -void LLFolderView::setOpenArrangeRecursively(BOOL open, ERecurseType recurse) /* Flawfinder: ignore */ +void LLFolderView::setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse) { // call base class to do proper recursion - LLFolderViewFolder::setOpenArrangeRecursively(open, recurse); /* Flawfinder: ignore */ + LLFolderViewFolder::setOpenArrangeRecursively(openitem, recurse); // make sure root folder is always open mIsOpen = TRUE; } @@ -2866,7 +2854,7 @@ LLFolderViewItem* LLFolderView::getCurSelectedItem( void ) // Record the selected item and pass it down the hierachy. -BOOL LLFolderView::setSelection(LLFolderViewItem* selection, BOOL open, /* Flawfinder: ignore */ +BOOL LLFolderView::setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus) { if( selection == this ) @@ -2888,8 +2876,8 @@ BOOL LLFolderView::setSelection(LLFolderViewItem* selection, BOOL open, /* Flaw addToSelectionList(selection); } - BOOL rv = LLFolderViewFolder::setSelection(selection, open, take_keyboard_focus); - if(open && selection) + BOOL rv = LLFolderViewFolder::setSelection(selection, openitem, take_keyboard_focus); + if(openitem && selection) { selection->getParentFolder()->requestArrange(); } @@ -3349,7 +3337,7 @@ void LLFolderView::openSelectedItems( void ) { if (mSelectedItems.size() == 1) { - mSelectedItems.front()->open(); /* Flawfinder: ignore */ + mSelectedItems.front()->openItem(); } else { @@ -3371,7 +3359,7 @@ void LLFolderView::openSelectedItems( void ) LLFloater::setFloaterHost(multi_propertiesp); else LLFloater::setFloaterHost(multi_previewp); - (*item_it)->open(); + (*item_it)->openItem(); } LLFloater::setFloaterHost(NULL); @@ -4358,7 +4346,7 @@ bool LLInventorySort::updateSort(U32 order) return false; } -bool LLInventorySort::operator()(LLFolderViewItem* a, LLFolderViewItem* b) +bool LLInventorySort::operator()(const LLFolderViewItem* const& a, const LLFolderViewItem* const& b) { // We sort by name if we aren't sorting by date // OR if these are folders and we are sorting folders by name. diff --git a/linden/indra/newview/llfolderview.h b/linden/indra/newview/llfolderview.h index bbf4b1d..3858388 100644 --- a/linden/indra/newview/llfolderview.h +++ b/linden/indra/newview/llfolderview.h @@ -295,7 +295,7 @@ public: bool updateSort(U32 order); U32 getSort() { return mSortOrder; } - bool operator()(LLFolderViewItem* a, LLFolderViewItem* b); + bool operator()(const LLFolderViewItem* const& a, const LLFolderViewItem* const& b); private: U32 mSortOrder; bool mByDate; @@ -361,7 +361,7 @@ protected: // the specified selected item appropriately for display and use // in the UI. If open is TRUE, then folders are opened up along // the way to the selection. - void setSelectionFromRoot(LLFolderViewItem* selection, BOOL open, /* Flawfinder: ignore */ + void setSelectionFromRoot(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus = TRUE); // helper function to change the selection from the root. @@ -390,7 +390,7 @@ public: enum { ARRANGE = TRUE, DO_NOT_ARRANGE = FALSE }; virtual BOOL addToFolder(LLFolderViewFolder* folder, LLFolderView* root); - virtual EInventorySortGroup getSortGroup(); + virtual EInventorySortGroup getSortGroup() const; // Finds width and height of this object and it's children. Also // makes sure that this view and it's children are the right size. @@ -409,7 +409,7 @@ public: // ignore. Returns TRUE if this object was affected. If open is // TRUE, then folders are opened up along the way to the // selection. - virtual BOOL setSelection(LLFolderViewItem* selection, BOOL open, /* Flawfinder: ignore */ + virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus); // This method is used to toggle the selection of an item. If @@ -479,7 +479,7 @@ public: void rename(const LLString& new_name); // open - virtual void open( void ); /* Flawfinder: ignore */ + virtual void openItem( void ); virtual void preview(void); // Show children (unfortunate that this is called "open") @@ -544,8 +544,8 @@ public: } ETrash; protected: - typedef std::vector items_t; - typedef std::vector folders_t; + typedef std::list items_t; + typedef std::list folders_t; items_t mItems; folders_t mFolders; LLInventorySort mSortFunction; @@ -556,7 +556,7 @@ protected: F32 mTargetHeight; F32 mAutoOpenCountdown; U32 mSubtreeCreationDate; - ETrash mAmTrash; + mutable ETrash mAmTrash; S32 mLastArrangeGeneration; S32 mLastCalculatedWidth; S32 mCompletedFilterGeneration; @@ -590,7 +590,7 @@ public: BOOL needsArrange(); // Returns the sort group (system, trash, folder) for this folder. - virtual EInventorySortGroup getSortGroup(); + virtual EInventorySortGroup getSortGroup() const; virtual void setCompletedFilterGeneration(S32 generation, BOOL recurse_up); virtual S32 getCompletedFilterGeneration() { return mCompletedFilterGeneration; } @@ -606,8 +606,8 @@ public: // Passes selection information on to children and record // selection information if necessary. Returns TRUE if this object // (or a child) was affected. - virtual BOOL setSelection(LLFolderViewItem* selection, BOOL open, /* Flawfinder: ignore */ - BOOL take_keyboard_focus); + virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem, + BOOL take_keyboard_focus); // This method is used to change the selection of an item. If // selection is 'this', then note selection as true. Returns TRUE @@ -660,7 +660,7 @@ public: virtual void toggleOpen(); // Force a folder open or closed - virtual void setOpen(BOOL open = TRUE); /* Flawfinder: ignore */ + virtual void setOpen(BOOL openitem = TRUE); // Called when a child is refreshed. // don't rearrange child folder contents unless explicitly requested @@ -670,7 +670,7 @@ public: // method was written because the list iterators destroy the state // of other iterations, thus, we can't arrange while iterating // through the children (such as when setting which is selected. - virtual void setOpenArrangeRecursively(BOOL open, ERecurseType recurse = RECURSE_NO); /* Flawfinder: ignore */ + virtual void setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse = RECURSE_NO); // Get the current state of the folder. virtual BOOL isOpen() { return mIsOpen; } @@ -686,7 +686,7 @@ public: void applyFunctorRecursively(LLFolderViewFunctor& functor); virtual void applyListenerFunctorRecursively(LLFolderViewListenerFunctor& functor); - virtual void open( void ); /* Flawfinder: ignore */ + virtual void openItem( void ); virtual BOOL addItem(LLFolderViewItem* item); virtual BOOL addFolder( LLFolderViewFolder* folder); @@ -703,7 +703,7 @@ public: virtual void draw(); U32 getCreationDate() const; - bool isTrash(); + bool isTrash() const; }; @@ -752,7 +752,7 @@ public: void openFolder(const LLString& foldername); virtual void toggleOpen() {}; - virtual void setOpenArrangeRecursively(BOOL open, ERecurseType recurse); /* Flawfinder: ignore */ + virtual void setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse); virtual BOOL addFolder( LLFolderViewFolder* folder); // Finds width and height of this object and it's children. Also @@ -769,7 +769,7 @@ public: virtual LLFolderViewItem* getCurSelectedItem( void ); // Record the selected item and pass it down the hierachy. - virtual BOOL setSelection(LLFolderViewItem* selection, BOOL open, /* Flawfinder: ignore */ + virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus); // This method is used to toggle the selection of an item. Walks diff --git a/linden/indra/newview/llgroupnotify.cpp b/linden/indra/newview/llgroupnotify.cpp index d760e8b..bef8eb5 100644 --- a/linden/indra/newview/llgroupnotify.cpp +++ b/linden/indra/newview/llgroupnotify.cpp @@ -414,7 +414,14 @@ void LLGroupNotifyBox::moveToBack() if (sGroupNotifyBoxCount > 1) { LLView* view = gNotifyBoxView->getFirstChild(); + + llassert_always(view) ; + llassert_always(view->getName() == "groupnotify"); + LLGroupNotifyBox* front = (LLGroupNotifyBox*)view; + + llassert_always(front->mNextBtn) ; + front->mNextBtn->setVisible(TRUE); } } diff --git a/linden/indra/newview/llimpanel.cpp b/linden/indra/newview/llimpanel.cpp index 2e3682d..d354dbb 100644 --- a/linden/indra/newview/llimpanel.cpp +++ b/linden/indra/newview/llimpanel.cpp @@ -1488,14 +1488,15 @@ void LLFloaterIMPanel::addHistoryLine(const std::string &utf8msg, const LLColor4 // Don't hotlink any messages from the system (e.g. "Second Life:"), so just add those in plain text. if (!strcmp(name,SYSTEM_FROM)) { - mHistoryEditor->appendColoredText(name,false,false,color); + mHistoryEditor->appendColoredText(name,false,prepend_newline,color); } else { // Convert the name to a hotlink and add to message. const LLStyleSP &source_style = LLStyleMap::instance().lookup(source); - mHistoryEditor->appendStyledText(name, false, false, &source_style); + mHistoryEditor->appendStyledText(name,false,prepend_newline,&source_style); } + prepend_newline = false; } mHistoryEditor->appendColoredText(utf8msg, false, prepend_newline, color); diff --git a/linden/indra/newview/llpaneldirfind.cpp b/linden/indra/newview/llpaneldirfind.cpp index 9bf71d9..92964ba 100644 --- a/linden/indra/newview/llpaneldirfind.cpp +++ b/linden/indra/newview/llpaneldirfind.cpp @@ -236,12 +236,20 @@ std::string LLPanelDirFind::buildSearchURL(const std::string& search_text, const url = gSavedSettings.getString("SearchURLQuery"); std::string substring = "[QUERY]"; - url.replace(url.find(substring), substring.length(), query); + std::string::size_type where = url.find(substring); + if (where != std::string::npos) + { + url.replace(where, substring.length(), query); + } // replace the collection name with the one selected from the combo box // std::string selected_collection = childGetValue( "Category" ).asString(); substring = "[COLLECTION]"; - url.replace(url.find(substring), substring.length(), collection); + where = url.find(substring); + if (where != std::string::npos) + { + url.replace(where, substring.length(), collection); + } llinfos << "url " << url << llendl; } diff --git a/linden/indra/newview/llpaneldirplaces.cpp b/linden/indra/newview/llpaneldirplaces.cpp index 3980fb4..b75218b 100644 --- a/linden/indra/newview/llpaneldirplaces.cpp +++ b/linden/indra/newview/llpaneldirplaces.cpp @@ -33,37 +33,173 @@ #include "llpaneldirplaces.h" -#include "llwebbrowserctrl.h" +// linden library includes +//#include "llfontgl.h" +#include "message.h" +//#include "lldir.h" +#include "llparcel.h" // parcel categories +//#include "llregionflags.h" +#include "llqueryflags.h" + +// viewer project includes +#include "llagent.h" // getID(), isTeen() +//#include "llbutton.h" +//#include "llcheckboxctrl.h" +//#include "llcombobox.h" +//#include "llfloaterdirectory.h" +//#include "lllineeditor.h" +#include "llviewerwindow.h" // alertXml() +#include "llpaneldirbrowser.h" +//#include "lltextbox.h" +//#include "lluiconstants.h" +#include "llviewercontrol.h" // gSavedSettings +#include "llviewermessage.h" +//#include "llworldmap.h" LLPanelDirPlaces::LLPanelDirPlaces(const std::string& name, LLFloaterDirectory* floater) -: LLPanelDirFind(name, floater, "places_browser") + : LLPanelDirBrowser(name, floater) +{ + // MBW -- HACK!!! + // This looks like some sort of compiler bug. We have a mysterious crash during initialization on powerpc boxes. + // The crash seems unrelated to this code, but the commit that introduced it was narrowed down to this file. + // Adding llinfos calls to both the constructor and destructor here makes the crash go away, even though they don't get called before the point of the crash. + // This is wrong on many levels and scares the hell out of me. + llinfos << "called" << llendl; + mMinSearchChars = 3; +} + +BOOL LLPanelDirPlaces::postBuild() +{ + LLPanelDirBrowser::postBuild(); + + childSetKeystrokeCallback("name", &LLPanelDirBrowser::onKeystrokeName, this); + + childSetAction("Search", &LLPanelDirBrowser::onClickSearchCore, this); + childDisable("Search"); + + mCurrentSortColumn = "dwell"; + mCurrentSortAscending = FALSE; + + // Don't prepopulate the places list, as it hurts the database as of 2006-12-04. JC + // initialQuery(); + + return TRUE; +} + +LLPanelDirPlaces::~LLPanelDirPlaces() { + // MBW -- HACK!!! + // This looks like some sort of compiler bug. We have a mysterious crash during initialization on powerpc boxes. + // The crash seems unrelated to this code, but the commit that introduced it was narrowed down to this file. + // Adding llinfos calls to both the constructor and destructor here makes the crash go away, even though they don't get called before the point of the crash. + // This is wrong on many levels and scares the hell out of me. + llinfos << "called" << llendl; + // Children all cleaned up by default view destructor. } -void LLPanelDirPlaces::search(const std::string& search_text) +// virtual +void LLPanelDirPlaces::draw() +{ + // You only have a choice if you are mature + childSetVisible("incmature", !gAgent.isTeen()); + childSetValue("incmature", gSavedSettings.getBOOL("ShowMatureSims")); + + LLPanelDirBrowser::draw(); +} + +// virtual +void LLPanelDirPlaces::performQuery() { - if (!search_text.empty()) + LLString place_name = childGetValue("name").asString(); + if (place_name.length() < mMinSearchChars) { - bool mature = childGetValue( "mature_check" ).asBoolean(); - std::string selected_collection = "Places"; - std::string url = buildSearchURL(search_text, selected_collection, mature); - if (mWebBrowser) - { - mWebBrowser->navigateTo(url); - } + return; + } + + // "hi " is three chars but not a long-enough search + std::string query_string = place_name; + LLString::trim( query_string ); + bool query_was_filtered = (query_string != place_name); + + // possible we threw away all the short words in the query so check length + if ( query_string.length() < mMinSearchChars ) + { + gViewerWindow->alertXml("SeachFilteredOnShortWordsEmpty"); + return; + }; + + // if we filtered something out, display a popup + if ( query_was_filtered ) + { + LLString::format_map_t args; + args["[FINALQUERY]"] = query_string; + gViewerWindow->alertXml("SeachFilteredOnShortWords", args); + }; + + LLString catstring = childGetValue("Category").asString(); + + // Because LLParcel::C_ANY is -1, must do special check + S32 category = 0; + if (catstring == "any") + { + category = LLParcel::C_ANY; } else { - // empty search text - navigateToDefaultPage(); + category = LLParcel::getCategoryFromString(catstring.c_str()); } - childSetText("search_editor", search_text); + BOOL pg_only = !gSavedSettings.getBOOL("ShowMatureSims") + || gAgent.isTeen(); + + queryCore(query_string, category, pg_only); } -LLPanelDirPlaces::~LLPanelDirPlaces() +void LLPanelDirPlaces::initialQuery() { - // Children all cleaned up by default view destructor. + // All Linden locations in PG/Mature sims, any name. + const BOOL pg_only = FALSE; + queryCore("", LLParcel::C_LINDEN, pg_only); +} + +void LLPanelDirPlaces::queryCore(const LLString& name, + S32 category, + BOOL pg_only) +{ + setupNewSearch(); + + // send the message + U32 flags = 0x0; + + if (pg_only) + { + flags |= DFQ_PG_PARCELS_ONLY; + } + +// JC: Sorting by dwell severely impacts the performance of the query. +// Instead of sorting on the dataserver, we sort locally once the results +// are received. +// IW: Re-enabled dwell sort based on new 3-character minimum description +// Hopefully we'll move to next-gen Find before this becomes a big problem + + flags |= DFQ_DWELL_SORT; + + LLMessageSystem* msg = gMessageSystem; + + msg->newMessage("DirPlacesQuery"); + msg->nextBlock("AgentData"); + msg->addUUID("AgentID", gAgent.getID()); + msg->addUUID("SessionID", gAgent.getSessionID()); + msg->nextBlock("QueryData"); + msg->addUUID("QueryID", getSearchID()); + msg->addString("QueryText", name); + msg->addU32("QueryFlags", flags); + msg->addS8("Category", (S8)category); + // No longer support queries by region name, too many regions + // for combobox, no easy way to do autocomplete. JC + msg->addString("SimName", ""); + msg->addS32Fast(_PREHASH_QueryStart,mSearchStart); + gAgent.sendReliableMessage(); } diff --git a/linden/indra/newview/llpaneldirplaces.h b/linden/indra/newview/llpaneldirplaces.h index 4785f94..7bc2b08 100644 --- a/linden/indra/newview/llpaneldirplaces.h +++ b/linden/indra/newview/llpaneldirplaces.h @@ -32,17 +32,31 @@ #ifndef LL_LLPANELDIRPLACES_H #define LL_LLPANELDIRPLACES_H -#include "llpaneldirfind.h" +#include "llpaneldirbrowser.h" // UI class forward declarations +class LLLineEditor; -class LLPanelDirPlaces : public LLPanelDirFind +class LLPanelDirPlaces : public LLPanelDirBrowser { public: LLPanelDirPlaces(const std::string& name, LLFloaterDirectory* floater); virtual ~LLPanelDirPlaces(); - /*virtual*/ void search(const std::string& search_text); + /*virtual*/ void draw(); + virtual BOOL postBuild(); + + static void onClickSearch(void *userdata); + static void onKeystrokeName(LLLineEditor* line, void* data); + + void performQuery(); + + // Initially fill in some data for the panel. + void initialQuery(); + +private: + void queryCore(const LLString& name, S32 category, BOOL pg_only); }; + #endif diff --git a/linden/indra/newview/llpanelgeneral.cpp b/linden/indra/newview/llpanelgeneral.cpp index 17fca4e..ee676b0 100644 --- a/linden/indra/newview/llpanelgeneral.cpp +++ b/linden/indra/newview/llpanelgeneral.cpp @@ -55,9 +55,7 @@ #include "llui.h" #include "llurlsimstring.h" #include "llviewercontrol.h" -#include "llappviewer.h" #include "llurlsimstring.h" -#include "llappviewer.h" #include "llcheckboxctrl.h" #include "llradiogroup.h" @@ -85,7 +83,7 @@ static void set_render_name_fade_out(LLUICtrl* ctrl, void* data) void set_crash_behavior(LLUICtrl* ctrl, void* data) { - LLAppViewer::instance()->setCrashBehavior(((LLComboBox*) ctrl)->getCurrentIndex()); + gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, ((LLComboBox*) ctrl)->getCurrentIndex()); } void set_language(LLUICtrl* ctrl, void* data) @@ -145,7 +143,7 @@ BOOL LLPanelGeneral::postBuild() combo = getChild( "crash_behavior_combobox"); if (combo) { - combo->setCurrentByIndex( LLAppViewer::instance()->getCrashBehavior() ); + combo->setCurrentByIndex( gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) ); combo->setCommitCallback( &set_crash_behavior ); } @@ -181,11 +179,11 @@ void LLPanelGeneral::refresh() mLoginLocation = combo->getValue().asString(); } - mCrashBehavior = LLAppViewer::instance()->getCrashBehavior(); + mOldCrashBehavior = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING); combo = getChild( "crash_behavior_combobox"); if (combo) { - combo->setCurrentByIndex( LLAppViewer::instance()->getCrashBehavior() ); + combo->setCurrentByIndex( mOldCrashBehavior ); } mRenderName = gSavedSettings.getS32("RenderName"); @@ -235,7 +233,7 @@ void LLPanelGeneral::cancel() LLURLSimString::setString(mLoginLocation); - LLAppViewer::instance()->setCrashBehavior(mCrashBehavior); + gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, mOldCrashBehavior); } void LLPanelGeneral::clickShowStartLocation(LLUICtrl*, void* user_data) diff --git a/linden/indra/newview/llpanelgeneral.h b/linden/indra/newview/llpanelgeneral.h index d84aa20..df9e10e 100644 --- a/linden/indra/newview/llpanelgeneral.h +++ b/linden/indra/newview/llpanelgeneral.h @@ -71,7 +71,7 @@ protected: F32 mUIScaleFactor; BOOL mUIAutoScale; BOOL mMiniMapRotate; - S32 mCrashBehavior; + S32 mOldCrashBehavior; LLString mLoginLocation; LLString mLanguage; }; diff --git a/linden/indra/newview/llpanellogin.cpp b/linden/indra/newview/llpanellogin.cpp index 334e9f4..d8da3c0 100644 --- a/linden/indra/newview/llpanellogin.cpp +++ b/linden/indra/newview/llpanellogin.cpp @@ -290,7 +290,15 @@ class LLIamHereLogin : public LLHTTPClient::Responder { mParent = parentIn; }; - + + // We don't actually expect LLSD back, so need to override completedRaw + virtual void completedRaw(U32 status, const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer) + { + completed(status, reason, LLSD()); // will call result() or error() + } + virtual void result( const LLSD& content ) { if ( mParent ) @@ -939,10 +947,13 @@ void LLPanelLogin::loadLoginPage() gViewerWindow->setMenuBackgroundColor(false, !LLViewerLogin::getInstance()->isInProductionGrid()); gLoginMenuBarView->setBackgroundColor(gMenuBarView->getBackgroundColor()); - - char* curl_grid = curl_escape(grid.c_str(), 0); - oStr << "&grid=" << curl_grid; - curl_free(curl_grid); + + if (!grid.empty()) + { + char* curl_grid = curl_escape(grid.c_str(), 0); + oStr << "&grid=" << curl_grid; + curl_free(curl_grid); + } #if USE_VIEWER_AUTH LLURLSimString::sInstance.parse(); diff --git a/linden/indra/newview/llselectmgr.cpp b/linden/indra/newview/llselectmgr.cpp index 4488a46..1aad3e2 100644 --- a/linden/indra/newview/llselectmgr.cpp +++ b/linden/indra/newview/llselectmgr.cpp @@ -4824,11 +4824,21 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud) if (mSelectedObjects->getNumNodes()) { LLUUID inspect_item_id = LLFloaterInspect::getSelectedUUID(); + for (S32 pass = 0; pass < 2; pass++) { + LLObjectSelection::iterator end_ = mSelectedObjects->end(); + S32 num_nodes = mSelectedObjects->getNumNodes() ; + LLObjectSelection::iterator prev_iter = mSelectedObjects->end(); for (LLObjectSelection::iterator iter = mSelectedObjects->begin(); iter != mSelectedObjects->end(); iter++) { + llassert_always(end_ == mSelectedObjects->end()) ;//mSelectedObjects should not grow + llassert_always(prev_iter != iter) ; //iter should move + llassert_always(num_nodes > 0) ; //iter should not circle inside mSelectedObjects. + num_nodes-- ; + prev_iter = iter ; + LLSelectNode* node = *iter; LLViewerObject* objectp = node->getObject(); if (!objectp) diff --git a/linden/indra/newview/llspatialpartition.cpp b/linden/indra/newview/llspatialpartition.cpp index 520501e..250575c 100644 --- a/linden/indra/newview/llspatialpartition.cpp +++ b/linden/indra/newview/llspatialpartition.cpp @@ -60,6 +60,7 @@ const F32 SG_OCCLUSION_FUDGE = 1.01f; static U32 sZombieGroups = 0; U32 LLSpatialGroup::sNodeCount = 0; +BOOL LLSpatialGroup::sNoDelete = FALSE; static F32 sLastMaxTexPriority = 1.f; static F32 sCurMaxTexPriority = 1.f; @@ -295,6 +296,11 @@ S32 LLSphereAABB(const LLVector3& center, const LLVector3& size, const LLVector3 LLSpatialGroup::~LLSpatialGroup() { + if (sNoDelete) + { + llerrs << "Illegal deletion of LLSpatialGroup!" << llendl; + } + if (isState(DEAD)) { sZombieGroups--; @@ -2619,7 +2625,10 @@ LLDrawInfo::LLDrawInfo(U16 start, U16 end, U32 count, U32 offset, LLDrawInfo::~LLDrawInfo() { - + if (LLSpatialGroup::sNoDelete) + { + llerrs << "LLDrawInfo deleted illegally!" << llendl; + } } LLVertexBuffer* LLGeometryManager::createVertexBuffer(U32 type_mask, U32 usage) @@ -2813,7 +2822,16 @@ void LLCullResult::pushDrawInfo(U32 type, LLDrawInfo* draw_info) } - +void LLCullResult::assertDrawMapsEmpty() +{ + for (U32 i = 0; i < LLRenderPass::NUM_RENDER_TYPES; i++) + { + if (mRenderMapSize[i] != 0) + { + llerrs << "Stale LLDrawInfo's in LLCullResult!" << llendl; + } + } +} diff --git a/linden/indra/newview/llspatialpartition.h b/linden/indra/newview/llspatialpartition.h index a38e3fe..bbd4add 100644 --- a/linden/indra/newview/llspatialpartition.h +++ b/linden/indra/newview/llspatialpartition.h @@ -127,6 +127,7 @@ class LLSpatialGroup : public LLOctreeListener friend class LLSpatialPartition; public: static U32 sNodeCount; + static BOOL sNoDelete; //deletion of spatial groups and draw info not allowed if TRUE typedef std::vector > sg_vector_t; typedef std::set > sg_set_t; @@ -421,7 +422,7 @@ public: void pushDrawable(LLDrawable* drawable); void pushBridge(LLSpatialBridge* bridge); void pushDrawInfo(U32 type, LLDrawInfo* draw_info); - + U32 getVisibleGroupsSize() { return mVisibleGroupsSize; } U32 getAlphaGroupsSize() { return mAlphaGroupsSize; } U32 getDrawableGroupsSize() { return mDrawableGroupsSize; } @@ -429,6 +430,8 @@ public: U32 getVisibleBridgeSize() { return mVisibleBridgeSize; } U32 getRenderMapSize(U32 type) { return mRenderMapSize[type]; } + void assertDrawMapsEmpty(); + private: U32 mVisibleGroupsSize; U32 mAlphaGroupsSize; diff --git a/linden/indra/newview/llstartup.cpp b/linden/indra/newview/llstartup.cpp index 4dca600..009cdd2 100644 --- a/linden/indra/newview/llstartup.cpp +++ b/linden/indra/newview/llstartup.cpp @@ -1278,7 +1278,6 @@ BOOL idle_startup() save_password_to_disk(NULL); } gSavedSettings.setBOOL("RememberPassword", remember_password); - gSavedSettings.setBOOL("LoginLastLocation", gSavedSettings.getBOOL("LoginLastLocation")); text = LLUserAuth::getInstance()->getResponse("agent_access"); if(text && (text[0] == 'M')) diff --git a/linden/indra/newview/lltoolbrush.cpp b/linden/indra/newview/lltoolbrush.cpp index 9958d50..89cb0b6 100644 --- a/linden/indra/newview/lltoolbrush.cpp +++ b/linden/indra/newview/lltoolbrush.cpp @@ -94,7 +94,6 @@ LLToolBrushLand::LLToolBrushLand() mMouseX( 0 ), mMouseY(0), mGotHover(FALSE), - mLastShowParcelOwners(FALSE), mBrushSelected(FALSE) { mBrushIndex = gSavedSettings.getS32("RadioLandBrushSize"); @@ -104,7 +103,8 @@ void LLToolBrushLand::modifyLandAtPointGlobal(const LLVector3d &pos_global, MASK mask) { S32 radioAction = gSavedSettings.getS32("RadioLandBrushAction"); - + + mLastAffectedRegions.clear(); determineAffectedRegions(mLastAffectedRegions, pos_global); for(region_list_t::iterator iter = mLastAffectedRegions.begin(); iter != mLastAffectedRegions.end(); ++iter) @@ -418,8 +418,6 @@ void LLToolBrushLand::handleSelect() gFloaterTools->setStatusText("modifyland"); // if (!mBrushSelected) { - mLastShowParcelOwners = gSavedSettings.getBOOL("ShowParcelOwners"); - gSavedSettings.setBOOL("ShowParcelOwners", mLastShowParcelOwners); mBrushSelected = TRUE; } } @@ -431,8 +429,6 @@ void LLToolBrushLand::handleDeselect() { gEditMenuHandler = NULL; } - mLastShowParcelOwners = gSavedSettings.getBOOL("ShowParcelOwners"); - gSavedSettings.setBOOL("ShowParcelOwners", mLastShowParcelOwners); LLViewerParcelMgr::getInstance()->setSelectionVisible(TRUE); mBrushSelected = FALSE; } diff --git a/linden/indra/newview/lltoolbrush.h b/linden/indra/newview/lltoolbrush.h index b3a5576..0ba6db4 100644 --- a/linden/indra/newview/lltoolbrush.h +++ b/linden/indra/newview/lltoolbrush.h @@ -97,7 +97,6 @@ protected: S32 mMouseY; S32 mBrushIndex; BOOL mGotHover; - BOOL mLastShowParcelOwners; BOOL mBrushSelected; // Order doesn't matter and we do check for existance of regions, so use a set region_list_t mLastAffectedRegions; diff --git a/linden/indra/newview/lltoolpie.cpp b/linden/indra/newview/lltoolpie.cpp index a9e733a..6879198 100644 --- a/linden/indra/newview/lltoolpie.cpp +++ b/linden/indra/newview/lltoolpie.cpp @@ -309,6 +309,7 @@ BOOL LLToolPie::pickAndShowMenu(S32 x, S32 y, MASK mask, BOOL always_show) } else if (mHitObjectID == gAgent.getID() ) { + llassert_always(gPieSelf) ; gPieSelf->show(x, y, mPieMouseButtonDown); } else if (object) diff --git a/linden/indra/newview/lltoolselectland.cpp b/linden/indra/newview/lltoolselectland.cpp index 96e0de1..78c4c24 100644 --- a/linden/indra/newview/lltoolselectland.cpp +++ b/linden/indra/newview/lltoolselectland.cpp @@ -61,8 +61,7 @@ LLToolSelectLand::LLToolSelectLand( ) mDragEndY(0), mMouseOutsideSlop(FALSE), mWestSouthBottom(), - mEastNorthTop(), - mLastShowParcelOwners(FALSE) + mEastNorthTop() { } LLToolSelectLand::~LLToolSelectLand() @@ -216,17 +215,12 @@ void LLToolSelectLand::render() void LLToolSelectLand::handleSelect() { gFloaterTools->setStatusText("selectland"); - mLastShowParcelOwners = gSavedSettings.getBOOL("ShowParcelOwners"); - gSavedSettings.setBOOL("ShowParcelOwners", mLastShowParcelOwners); } void LLToolSelectLand::handleDeselect() { mSelection = NULL; - mLastShowParcelOwners = gSavedSettings.getBOOL("ShowParcelOwners"); - //LLViewerParcelMgr::getInstance()->deselectLand(); - gSavedSettings.setBOOL("ShowParcelOwners", mLastShowParcelOwners); } diff --git a/linden/indra/newview/lltoolselectland.h b/linden/indra/newview/lltoolselectland.h index 1e1462b..19a86b7 100644 --- a/linden/indra/newview/lltoolselectland.h +++ b/linden/indra/newview/lltoolselectland.h @@ -74,7 +74,6 @@ protected: LLVector3d mWestSouthBottom; // global coords, from drag LLVector3d mEastNorthTop; // global coords, from drag - BOOL mLastShowParcelOwners; // store last Show Parcel Owners setting LLSafeHandle mSelection; // hold on to a parcel selection }; diff --git a/linden/indra/newview/llviewerdisplay.cpp b/linden/indra/newview/llviewerdisplay.cpp index 47c9c32..b9a5986 100644 --- a/linden/indra/newview/llviewerdisplay.cpp +++ b/linden/indra/newview/llviewerdisplay.cpp @@ -81,8 +81,6 @@ #include "llpostprocess.h" extern LLPointer gStartImageGL; -extern BOOL gDisplaySwapBuffers; - LLPointer gDisconnectedImagep = NULL; @@ -96,17 +94,18 @@ const F32 RESTORE_GL_TIME = 5.f; // Wait this long while reloading textures bef BOOL gForceRenderLandFence = FALSE; BOOL gDisplaySwapBuffers = FALSE; +BOOL gDepthDirty = FALSE; BOOL gResizeScreenTexture = FALSE; BOOL gSnapshot = FALSE; U32 gRecentFrameCount = 0; // number of 'recent' frames -LLFrameTimer gRecentTime; +LLFrameTimer gRecentFPSTime; +LLFrameTimer gRecentMemoryTime; // Rendering stuff void pre_show_depth_buffer(); void post_show_depth_buffer(); void render_ui_and_swap(); -void render_ui_and_swap_if_needed(); void render_hud_attachments(); void render_ui_3d(); void render_ui_2d(); @@ -187,13 +186,21 @@ void display_update_camera() // Write some stats to llinfos void display_stats() { - F32 log_freq = gSavedSettings.getF32("FPSLogFrequency"); - if (log_freq > 0.f && gRecentTime.getElapsedTimeF32() >= log_freq) + F32 fps_log_freq = gSavedSettings.getF32("FPSLogFrequency"); + if (fps_log_freq > 0.f && gRecentFPSTime.getElapsedTimeF32() >= fps_log_freq) { - F32 fps = gRecentFrameCount / log_freq; + F32 fps = gRecentFrameCount / fps_log_freq; llinfos << llformat("FPS: %.02f", fps) << llendl; gRecentFrameCount = 0; - gRecentTime.reset(); + gRecentFPSTime.reset(); + } + F32 mem_log_freq = gSavedSettings.getF32("MemoryLogFrequency"); + if (mem_log_freq > 0.f && gRecentMemoryTime.getElapsedTimeF32() >= mem_log_freq) + { + gMemoryAllocated = getCurrentRSS(); + U32 memory = (U32)(gMemoryAllocated / (1024*1024)); + llinfos << llformat("MEMORY: %d MB", memory) << llendl; + gRecentMemoryTime.reset(); } } @@ -237,9 +244,11 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) gViewerWindow->checkSettings(); + LLAppViewer::instance()->pingMainloopTimeout("Display:Pick"); gViewerWindow->performPick(); + LLAppViewer::instance()->pingMainloopTimeout("Display:CheckStates"); LLGLState::checkStates(); LLGLState::checkTextureChannels(); @@ -271,6 +280,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) // if (LLStartUp::getStartupState() < STATE_STARTED) { + LLAppViewer::instance()->pingMainloopTimeout("Display:Startup"); display_startup(); return; } @@ -282,6 +292,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) // Update GL Texture statistics (used for discard logic?) // + LLAppViewer::instance()->pingMainloopTimeout("Display:TextureStats"); gFrameStats.start(LLFrameStats::UPDATE_TEX_STATS); stop_glerror(); @@ -305,6 +316,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) if (gTeleportDisplay) { + LLAppViewer::instance()->pingMainloopTimeout("Display:Teleport"); const F32 TELEPORT_ARRIVAL_DELAY = 2.f; // Time to preload the world before raising the curtain after we've actually already arrived. S32 attach_count = 0; @@ -383,6 +395,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) } else if(LLAppViewer::instance()->logoutRequestSent()) { + LLAppViewer::instance()->pingMainloopTimeout("Display:Logout"); F32 percent_done = gLogoutTimer.getElapsedTimeF32() * 100.f / gLogoutMaxTime; if (percent_done > 100.f) { @@ -399,6 +412,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) else if (gRestoreGL) { + LLAppViewer::instance()->pingMainloopTimeout("Display:RestoreGL"); F32 percent_done = gRestoreGLTimer.getElapsedTimeF32() * 100.f / RESTORE_GL_TIME; if( percent_done > 100.f ) { @@ -428,6 +442,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) // // + LLAppViewer::instance()->pingMainloopTimeout("Display:Camera"); LLViewerCamera::getInstance()->setZoomParameters(zoom_factor, subfield); LLViewerCamera::getInstance()->setNear(MIN_NEAR_PLANE); @@ -439,9 +454,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) if (gDisconnected) { - render_ui_and_swap_if_needed(); - gDisplaySwapBuffers = TRUE; - + LLAppViewer::instance()->pingMainloopTimeout("Display:Disconnected"); + render_ui_and_swap(); render_disconnected_background(); } @@ -450,6 +464,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) // Set rendering options // // + LLAppViewer::instance()->pingMainloopTimeout("Display:RenderSetup"); stop_glerror(); if (gSavedSettings.getBOOL("ShowDepthBuffer")) { @@ -478,6 +493,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) // do render-to-texture stuff here if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_DYNAMIC_TEXTURES)) { + LLAppViewer::instance()->pingMainloopTimeout("Display:DynamicTextures"); LLFastTimer t(LLFastTimer::FTM_UPDATE_TEXTURES); if (LLDynamicTexture::updateAllInstances()) { @@ -490,6 +506,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) if (!gDisconnected) { + LLAppViewer::instance()->pingMainloopTimeout("Display:Update"); if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD)) { //don't draw hud objects in this frame gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_HUD); @@ -527,9 +544,12 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) } } + LLAppViewer::instance()->pingMainloopTimeout("Display:Cull"); + //Increment drawable frame counter LLDrawable::incrementVisible(); + LLSpatialGroup::sNoDelete = TRUE; LLPipeline::sUseOcclusion = (!gUseWireframe && LLFeatureManager::getInstance()->isFeatureAvailable("UseOcclusion") @@ -540,10 +560,11 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) LLVOAvatar::sMaxVisible = gSavedSettings.getS32("RenderAvatarMaxVisible"); S32 occlusion = LLPipeline::sUseOcclusion; - if (!gDisplaySwapBuffers) + if (gDepthDirty) { //depth buffer is invalid, don't overwrite occlusion state LLPipeline::sUseOcclusion = llmin(occlusion, 1); } + gDepthDirty = FALSE; static LLCullResult result; gPipeline.updateCull(*LLViewerCamera::getInstance(), result, water_clip); @@ -553,6 +574,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) gPipeline.canUseVertexShaders() && LLPipeline::sRenderGlow; + LLAppViewer::instance()->pingMainloopTimeout("Display:Swap"); + // now do the swap buffer (just before rendering to framebuffer) { //swap and flush state from previous frame { @@ -571,9 +594,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) if (!for_snapshot) { - render_ui_and_swap_if_needed(); - gDisplaySwapBuffers = TRUE; - glh::matrix4f proj = glh_get_current_projection(); glh::matrix4f mod = glh_get_current_modelview(); glViewport(0,0,512,512); @@ -592,6 +612,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) if (!for_snapshot) { + LLAppViewer::instance()->pingMainloopTimeout("Display:Imagery"); gPipeline.processImagery(*LLViewerCamera::getInstance()); gPipeline.generateWaterReflection(*LLViewerCamera::getInstance()); } @@ -603,6 +624,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) // Can put objects onto the retextured list. // // Doing this here gives hardware occlusion queries extra time to complete + LLAppViewer::instance()->pingMainloopTimeout("Display:UpdateImages"); gFrameStats.start(LLFrameStats::IMAGE_UPDATE); { @@ -626,6 +648,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) // In the case of alpha objects, z-sorts them first. // Also creates special lists for outlines and selected face rendering. // + LLAppViewer::instance()->pingMainloopTimeout("Display:StateSort"); { gFrameStats.start(LLFrameStats::STATE_SORT); gPipeline.stateSort(*LLViewerCamera::getInstance(), result); @@ -647,6 +670,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) LLPipeline::sUseOcclusion = occlusion; { + LLAppViewer::instance()->pingMainloopTimeout("Display:Sky"); LLFastTimer t(LLFastTimer::FTM_UPDATE_SKY); gSky.updateSky(); } @@ -658,6 +682,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); } + LLAppViewer::instance()->pingMainloopTimeout("Display:Render"); + //// render frontmost floater opaque for occlusion culling purposes //LLFloater* frontmost_floaterp = gFloaterView->getFrontmost(); //// assumes frontmost floater with focus is opaque @@ -731,11 +757,19 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) /// Using render to texture would be faster/better, but I don't have a /// grasp of their full display stack just yet. // gPostProcess->apply(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight()); + + if (!for_snapshot) + { + render_ui_and_swap(); + } + + LLSpatialGroup::sNoDelete = FALSE; } gFrameStats.start(LLFrameStats::RENDER_UI); if (gHandleKeysAsync) { + LLAppViewer::instance()->pingMainloopTimeout("Display:Keystrokes"); process_keystrokes_async(); stop_glerror(); } @@ -750,6 +784,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) } display_stats(); + + LLAppViewer::instance()->pingMainloopTimeout("Display:Done"); } void render_hud_attachments() @@ -944,19 +980,13 @@ void render_ui_and_swap() glh_set_current_modelview(saved_view); glPopMatrix(); -} -void render_ui_and_swap_if_needed() -{ if (gDisplaySwapBuffers) { - render_ui_and_swap(); - - { - LLFastTimer t(LLFastTimer::FTM_SWAP); - gViewerWindow->mWindow->swapBuffers(); - } + LLFastTimer t(LLFastTimer::FTM_SWAP); + gViewerWindow->mWindow->swapBuffers(); } + gDisplaySwapBuffers = TRUE; } void renderCoordinateAxes() diff --git a/linden/indra/newview/llviewerdisplay.h b/linden/indra/newview/llviewerdisplay.h index 22c31b7..d4b36aa 100644 --- a/linden/indra/newview/llviewerdisplay.h +++ b/linden/indra/newview/llviewerdisplay.h @@ -40,6 +40,7 @@ void display_cleanup(); void display(BOOL rebuild = TRUE, F32 zoom_factor = 1.f, int subfield = 0, BOOL for_snapshot = FALSE); extern BOOL gDisplaySwapBuffers; +extern BOOL gDepthDirty; extern BOOL gTeleportDisplay; extern LLFrameTimer gTeleportDisplayTimer; extern BOOL gForceRenderLandFence; diff --git a/linden/indra/newview/llviewerimage.cpp b/linden/indra/newview/llviewerimage.cpp index 0316c10..a564352 100644 --- a/linden/indra/newview/llviewerimage.cpp +++ b/linden/indra/newview/llviewerimage.cpp @@ -88,7 +88,7 @@ void LLViewerImage::initClass() sNullImagep->createGLTexture(0, raw); #if 1 - LLViewerImage* imagep = new LLViewerImage(IMG_DEFAULT, TRUE); + LLPointer imagep = new LLViewerImage(IMG_DEFAULT, TRUE); sDefaultImagep = imagep; const S32 dim = 128; LLPointer image_raw = new LLImageRaw(dim,dim,3); diff --git a/linden/indra/newview/llviewerimagelist.cpp b/linden/indra/newview/llviewerimagelist.cpp index a824b29..44c592a 100644 --- a/linden/indra/newview/llviewerimagelist.cpp +++ b/linden/indra/newview/llviewerimagelist.cpp @@ -708,6 +708,10 @@ void LLViewerImageList::updateImagesUpdateStats() iter != mImageList.end(); ) { LLViewerImage* imagep = *iter++; + + llassert_always(imagep) ; + llassert_always(imagep->getNumRefs() > 0 && imagep->getNumRefs() < 100000) ; + imagep->resetTextureStats(mForceResetTextureStats); } mUpdateStats = FALSE; diff --git a/linden/indra/newview/llviewerobject.cpp b/linden/indra/newview/llviewerobject.cpp index 54114e4..a989c9d 100644 --- a/linden/indra/newview/llviewerobject.cpp +++ b/linden/indra/newview/llviewerobject.cpp @@ -292,7 +292,7 @@ void LLViewerObject::markDead() LLViewerObject *childp; while (mChildList.size() > 0) { - childp = mChildList[0]; + childp = mChildList.back(); if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR) { //llinfos << "Marking child " << childp->getLocalID() << " as dead." << llendl; @@ -307,7 +307,7 @@ void LLViewerObject::markDead() ((LLVOAvatar*)childp)->getOffObject(); childp->setParent(NULL); // LLViewerObject::markDead 2 } - mChildList.erase(mChildList.begin()); + mChildList.pop_back(); } if (mDrawable.notNull()) @@ -4217,13 +4217,15 @@ void LLViewerObject::updateDrawable(BOOL force_damped) { BOOL damped_motion = !isChanged(SHIFTED) && // not shifted between regions this frame and... - (force_damped || // ...forced into damped motion by application logic or... - (!isSelected() && // ...not selected and... - (mDrawable->isRoot() || // ... is root or ... - !((LLViewerObject*)getParent())->isSelected()) && // ... parent is not selected and ... + ( force_damped || // ...forced into damped motion by application logic or... + ( !isSelected() && // ...not selected and... + ( mDrawable->isRoot() || // ... is root or ... + (getParent() && !((LLViewerObject*)getParent())->isSelected())// ... parent is not selected and ... + ) && getPCode() == LL_PCODE_VOLUME && // ...is a volume object and... getVelocity().isExactlyZero() && // ...is not moving physically and... - mDrawable->getGeneration() != -1) // ...was not created this frame. + mDrawable->getGeneration() != -1 // ...was not created this frame. + ) ); gPipeline.markMoved(mDrawable, damped_motion); } diff --git a/linden/indra/newview/llviewerobjectlist.cpp b/linden/indra/newview/llviewerobjectlist.cpp index bd8ed97..84475ab 100644 --- a/linden/indra/newview/llviewerobjectlist.cpp +++ b/linden/indra/newview/llviewerobjectlist.cpp @@ -685,6 +685,7 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world) idle_iter != idle_list.end(); idle_iter++) { objectp = *idle_iter; + llassert_always(objectp) ; if (!objectp->idleUpdate(agent, world, frame_time)) { // If Idle Update returns false, kill object! diff --git a/linden/indra/newview/llviewerregion.cpp b/linden/indra/newview/llviewerregion.cpp index e1590cc..f745aca 100644 --- a/linden/indra/newview/llviewerregion.cpp +++ b/linden/indra/newview/llviewerregion.cpp @@ -76,7 +76,74 @@ extern BOOL gNoRender; const F32 WATER_TEXTURE_SCALE = 8.f; // Number of times to repeat the water texture across a region const S16 MAX_MAP_DIST = 10; +class BaseCapabilitiesComplete : public LLHTTPClient::Responder +{ + LOG_CLASS(BaseCapabilitiesComplete); +public: + BaseCapabilitiesComplete(LLViewerRegion* region) + : mRegion(region) + { } + virtual ~BaseCapabilitiesComplete() + { + if(mRegion) + { + mRegion->setHttpResponderPtrNULL() ; + } + } + void setRegion(LLViewerRegion* region) + { + mRegion = region ; + } + + void error(U32 statusNum, const std::string& reason) + { + LL_WARNS2("AppInit", "Capabilities") << statusNum << ": " << reason << LL_ENDL; + + if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState()) + { + LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED ); + } + } + + void result(const LLSD& content) + { + if(!mRegion || this != mRegion->getHttpResponderPtr())//region is removed or responder is not created. + { + return ; + } + + LLSD::map_const_iterator iter; + for(iter = content.beginMap(); iter != content.endMap(); ++iter) + { + mRegion->setCapability(iter->first, iter->second); + LL_DEBUGS2("AppInit", "Capabilities") << "got capability for " + << iter->first << LL_ENDL; + + /* HACK we're waiting for the ServerReleaseNotes */ + if ((iter->first == "ServerReleaseNotes") && (LLFloaterReleaseMsg::sDisplayMessage)) + { + LLFloaterReleaseMsg::show(); + LLFloaterReleaseMsg::sDisplayMessage = false; + } + } + + if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState()) + { + LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED ); + } + } + + static boost::intrusive_ptr build( + LLViewerRegion* region) + { + return boost::intrusive_ptr( + new BaseCapabilitiesComplete(region)); + } + +private: + LLViewerRegion* mRegion; +}; LLViewerRegion::LLViewerRegion(const U64 &handle, @@ -103,7 +170,6 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, mEventPoll(NULL) { mWidth = region_width_meters; - mOriginGlobal = from_region_handle(handle); updateRenderMatrix(); @@ -170,10 +236,13 @@ void LLViewerRegion::initStats() mAlive = FALSE; // can become false if circuit disconnects } - - LLViewerRegion::~LLViewerRegion() { + if(mHttpResponderPtr) + { + (static_cast(mHttpResponderPtr.get()))->setRegion(NULL) ; + } + gVLManager.cleanupData(this); // Can't do this on destruction, because the neighbor pointers might be invalid. // This should be reference counted... @@ -1303,61 +1372,6 @@ void LLViewerRegion::unpackRegionHandshake() msg->sendReliable(host); } - - -class BaseCapabilitiesComplete : public LLHTTPClient::Responder -{ - LOG_CLASS(BaseCapabilitiesComplete); -public: - BaseCapabilitiesComplete(LLViewerRegion* region) - : mRegion(region) - { } - - void error(U32 statusNum, const std::string& reason) - { - LL_WARNS2("AppInit", "Capabilities") << statusNum << ": " << reason << LL_ENDL; - - if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState()) - { - LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED ); - } - } - - void result(const LLSD& content) - { - LLSD::map_const_iterator iter; - for(iter = content.beginMap(); iter != content.endMap(); ++iter) - { - mRegion->setCapability(iter->first, iter->second); - LL_DEBUGS2("AppInit", "Capabilities") << "got capability for " - << iter->first << LL_ENDL; - - /* HACK we're waiting for the ServerReleaseNotes */ - if ((iter->first == "ServerReleaseNotes") && (LLFloaterReleaseMsg::sDisplayMessage)) - { - LLFloaterReleaseMsg::show(); - LLFloaterReleaseMsg::sDisplayMessage = false; - } - } - - if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState()) - { - LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED ); - } - } - - static boost::intrusive_ptr build( - LLViewerRegion* region) - { - return boost::intrusive_ptr( - new BaseCapabilitiesComplete(region)); - } - -private: - LLViewerRegion* mRegion; -}; - - void LLViewerRegion::setSeedCapability(const std::string& url) { if (getCapability("Seed") == url) @@ -1408,7 +1422,8 @@ void LLViewerRegion::setSeedCapability(const std::string& url) llinfos << "posting to seed " << url << llendl; - LLHTTPClient::post(url, capabilityNames, BaseCapabilitiesComplete::build(this)); + mHttpResponderPtr = BaseCapabilitiesComplete::build(this) ; + LLHTTPClient::post(url, capabilityNames, mHttpResponderPtr); } void LLViewerRegion::setCapability(const std::string& name, const std::string& url) diff --git a/linden/indra/newview/llviewerregion.h b/linden/indra/newview/llviewerregion.h index d4032cf..c2d11f5 100644 --- a/linden/indra/newview/llviewerregion.h +++ b/linden/indra/newview/llviewerregion.h @@ -208,6 +208,9 @@ public: U32 getPacketsLost() const; + void setHttpResponderPtrNULL() {mHttpResponderPtr = NULL ;} + const LLHTTPClient::ResponderPtr getHttpResponderPtr() const {return mHttpResponderPtr ;} + // Get/set named capability URLs for this region. void setSeedCapability(const std::string& url); void setCapability(const std::string& name, const std::string& url); @@ -373,6 +376,8 @@ protected: private: //spatial partitions for objects in this region std::vector mObjectPartition; + + LLHTTPClient::ResponderPtr mHttpResponderPtr ; }; inline BOOL LLViewerRegion::getAllowDamage() const diff --git a/linden/indra/newview/llviewerwindow.cpp b/linden/indra/newview/llviewerwindow.cpp index 9f091dc..d61fa59 100644 --- a/linden/indra/newview/llviewerwindow.cpp +++ b/linden/indra/newview/llviewerwindow.cpp @@ -192,12 +192,12 @@ // // Globals // -void render_ui_and_swap_if_needed(); void render_ui_and_swap(); LLBottomPanel* gBottomPanel = NULL; extern BOOL gDebugClicks; extern BOOL gDisplaySwapBuffers; +extern BOOL gDepthDirty; extern BOOL gResizeScreenTexture; extern S32 gJamesInt; @@ -3387,9 +3387,8 @@ void LLViewerWindow::hitObjectOrLandGlobalAsync(S32 x, S32 y_from_bot, MASK mask return; } - render_ui_and_swap_if_needed(); glClear(GL_DEPTH_BUFFER_BIT); - gDisplaySwapBuffers = FALSE; + gDepthDirty = TRUE; S32 scaled_x = llround((F32)x * mDisplayScale.mV[VX]); S32 scaled_y = llround((F32)y_from_bot * mDisplayScale.mV[VY]); @@ -4282,7 +4281,8 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p LLRect window_rect = mWindowRect; mWindowRect.set(0, h, w, 0); - gDisplaySwapBuffers = FALSE; + gDisplaySwapBuffers = FALSE; + gDepthDirty = TRUE; glClearColor(0.f, 0.f, 0.f, 0.f); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); setup3DRender(); @@ -4350,6 +4350,7 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p setup3DRender(); setupViewport(); gDisplaySwapBuffers = FALSE; + gDepthDirty = TRUE; // POST SNAPSHOT if (!gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI)) @@ -4389,7 +4390,6 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei } // PRE SNAPSHOT - render_ui_and_swap_if_needed(); gDisplaySwapBuffers = FALSE; glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); @@ -4420,6 +4420,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei LLRect window_rect = mWindowRect; BOOL use_fbo = FALSE; + LLRenderTarget target; F32 scale_factor = 1.0f ; if(!keep_window_aspect) //image cropping { @@ -4428,37 +4429,39 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei snapshot_height = (S32)(ratio * image_height) ; scale_factor = llmax(1.0f, 1.0f / ratio) ; } - - LLRenderTarget target; - if (gGLManager.mHasFramebufferObject && - (image_width > window_width || - image_height > window_height) && - !show_ui && - keep_window_aspect) - { - GLint max_size = 0; - glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE_EXT, &max_size); - - if (image_width <= max_size && image_height <= max_size) - { - use_fbo = TRUE; - - snapshot_width = image_width; - snapshot_height = image_height; - target.allocate(snapshot_width, snapshot_height, GL_RGBA, TRUE, GL_TEXTURE_RECTANGLE_ARB, TRUE); - window_width = snapshot_width; - window_height = snapshot_height; - scale_factor = 1.f; - mWindowRect.set(0, 0, snapshot_width, snapshot_height); - target.bindTarget(); - } - else //tiling + else //the scene(window) proportion needs to be maintained. + { + if(image_width > window_width || image_height > window_height) //need to enlarge the scene { - F32 ratio = llmin( (F32)window_width / image_width , (F32)window_height / image_height) ; - snapshot_width = (S32)(ratio * image_width) ; - snapshot_height = (S32)(ratio * image_height) ; - scale_factor = llmax(1.0f, 1.0f / ratio) ; + if (gGLManager.mHasFramebufferObject && !show_ui) + { + GLint max_size = 0; + glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE_EXT, &max_size); + + if (image_width <= max_size && image_height <= max_size) //re-project the scene + { + use_fbo = TRUE; + + snapshot_width = image_width; + snapshot_height = image_height; + target.allocate(snapshot_width, snapshot_height, GL_RGBA, TRUE, GL_TEXTURE_RECTANGLE_ARB, TRUE); + window_width = snapshot_width; + window_height = snapshot_height; + scale_factor = 1.f; + mWindowRect.set(0, 0, snapshot_width, snapshot_height); + target.bindTarget(); + } + } + + if(!use_fbo) //no re-projection, so tiling the scene + { + F32 ratio = llmin( (F32)window_width / image_width , (F32)window_height / image_height) ; + snapshot_width = (S32)(ratio * image_width) ; + snapshot_height = (S32)(ratio * image_height) ; + scale_factor = llmax(1.0f, 1.0f / ratio) ; + } } + //else: keep the current scene scale, re-scale it if necessary after reading out. } S32 buffer_x_offset = llfloor(((window_width - snapshot_width) * scale_factor) / 2.f); @@ -4503,6 +4506,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei for (int subimage_x = 0; subimage_x < scale_factor; ++subimage_x) { gDisplaySwapBuffers = FALSE; + gDepthDirty = TRUE; if (type == SNAPSHOT_TYPE_OBJECT_ID) { glClearColor(0.f, 0.f, 0.f, 0.f); @@ -4586,6 +4590,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); } gDisplaySwapBuffers = FALSE; + gDepthDirty = TRUE; // POST SNAPSHOT if (!gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI)) diff --git a/linden/indra/newview/llvovolume.cpp b/linden/indra/newview/llvovolume.cpp index 6b5b9bb..a6d3c0b 100644 --- a/linden/indra/newview/llvovolume.cpp +++ b/linden/indra/newview/llvovolume.cpp @@ -1841,7 +1841,7 @@ F32 LLVOVolume::getBinRadius() } else { - radius = 32.f; + radius = llmax(mDrawable->getRadius(), 32.f); } } else diff --git a/linden/indra/newview/llwatchdog.cpp b/linden/indra/newview/llwatchdog.cpp index d92d381..55975ee 100644 --- a/linden/indra/newview/llwatchdog.cpp +++ b/linden/indra/newview/llwatchdog.cpp @@ -33,6 +33,8 @@ #include "llviewerprecompiledheaders.h" #include "llwatchdog.h" +const U32 WATCHDOG_SLEEP_TIME_USEC = 1000000; + // This class runs the watchdog timing thread. class LLWatchdogTimerThread : public LLThread { @@ -105,6 +107,11 @@ bool LLWatchdogTimeout::isAlive() const return (mTimer.getStarted() && !mTimer.hasExpired()); } +void LLWatchdogTimeout::reset() +{ + mTimer.setTimerExpirySec(mTimeout); +} + void LLWatchdogTimeout::setTimeout(F32 d) { mTimeout = d; @@ -132,13 +139,14 @@ void LLWatchdogTimeout::ping(const std::string& state) { mPingState = state; } - mTimer.setTimerExpirySec(mTimeout); + reset(); } -// LlWatchdog +// LLWatchdog LLWatchdog::LLWatchdog() : mSuspectsAccessMutex(NULL), - mTimer(NULL) + mTimer(NULL), + mLastClockCount(0) { } @@ -166,7 +174,11 @@ void LLWatchdog::init() { mSuspectsAccessMutex = new LLMutex(NULL); mTimer = new LLWatchdogTimerThread(); - mTimer->setSleepTime(1000); + mTimer->setSleepTime(WATCHDOG_SLEEP_TIME_USEC / 1000); + mLastClockCount = LLTimer::getTotalTime(); + + // mTimer->start() kicks off the thread, any code after + // start needs to use the mSuspectsAccessMutex mTimer->start(); } } @@ -177,40 +189,64 @@ void LLWatchdog::cleanup() { mTimer->stop(); delete mTimer; + mTimer = NULL; } if(mSuspectsAccessMutex) { delete mSuspectsAccessMutex; + mSuspectsAccessMutex = NULL; } + + mLastClockCount = 0; } void LLWatchdog::run() { lockThread(); + + // Check the time since the last call to run... + // If the time elapsed is two times greater than the regualr sleep time + // reset the active timeouts. + const U32 TIME_ELAPSED_MULTIPLIER = 2; + U64 current_time = LLTimer::getTotalTime(); + U64 current_run_delta = current_time - mLastClockCount; + mLastClockCount = current_time; - SuspectsRegistry::iterator result = - std::find_if(mSuspects.begin(), + if(current_run_delta > (WATCHDOG_SLEEP_TIME_USEC * TIME_ELAPSED_MULTIPLIER)) + { + llinfos << "Watchdog thread delayed: resetting entries." << llendl; + std::for_each(mSuspects.begin(), mSuspects.end(), - std::not1(std::mem_fun(&LLWatchdogEntry::isAlive)) + std::mem_fun(&LLWatchdogEntry::reset) ); - - if(result != mSuspects.end()) + } + else { - // error!!! - if(mTimer) + SuspectsRegistry::iterator result = + std::find_if(mSuspects.begin(), + mSuspects.end(), + std::not1(std::mem_fun(&LLWatchdogEntry::isAlive)) + ); + + if(result != mSuspects.end()) { - mTimer->stop(); - } + // error!!! + if(mTimer) + { + mTimer->stop(); + } - llinfos << "Watchdog detected error:" << llendl; + llinfos << "Watchdog detected error:" << llendl; #ifdef LL_WINDOWS - RaiseException(0,0,0,0); + RaiseException(0,0,0,0); #else - raise(SIGQUIT); + raise(SIGQUIT); #endif + } } + unlockThread(); } diff --git a/linden/indra/newview/llwatchdog.h b/linden/indra/newview/llwatchdog.h index c1f2b94..d196486 100644 --- a/linden/indra/newview/llwatchdog.h +++ b/linden/indra/newview/llwatchdog.h @@ -48,6 +48,7 @@ public: // This may mean that resources used by // isAlive and other method may need synchronization. virtual bool isAlive() const = 0; + virtual void reset() = 0; virtual void start(); virtual void stop(); }; @@ -59,6 +60,7 @@ public: virtual ~LLWatchdogTimeout(); /* virtual */ bool isAlive() const; + /* virtual */ void reset(); /* virtual */ void start(const std::string& state); /* virtual */ void stop(); @@ -95,6 +97,7 @@ private: SuspectsRegistry mSuspects; LLMutex* mSuspectsAccessMutex; LLWatchdogTimerThread* mTimer; + U64 mLastClockCount; }; #endif // LL_LLTHREADWATCHDOG_H diff --git a/linden/indra/newview/llwearable.cpp b/linden/indra/newview/llwearable.cpp index 6e8123a..27811e8 100644 --- a/linden/indra/newview/llwearable.cpp +++ b/linden/indra/newview/llwearable.cpp @@ -846,7 +846,7 @@ struct LLWearableSaveData void LLWearable::saveNewAsset() { // llinfos << "LLWearable::saveNewAsset() type: " << getTypeName() << llendl; - //dump(); + //llinfos << *this << llendl; char new_asset_id_string[UUID_STR_LENGTH]; /* Flawfinder: ignore */ mAssetID.toString(new_asset_id_string); @@ -949,31 +949,32 @@ BOOL LLWearable::isMatchedToInventoryItem( LLViewerInventoryItem* item ) ( mSaleInfo == item->getSaleInfo() ); } -void LLWearable::dump() +std::ostream& operator<<(std::ostream &s, const LLWearable &w) { - llinfos << "wearable " << LLWearable::typeToTypeName( mType ) << llendl; - llinfos << " Name: " << mName << llendl; - llinfos << " Desc: " << mDescription << llendl; - //mPermissions - //mSaleInfo + s << "wearable " << LLWearable::typeToTypeName( w.mType ) << "\n"; + s << " Name: " << w.mName << "\n"; + s << " Desc: " << w.mDescription << "\n"; + //w.mPermissions + //w.mSaleInfo - llinfos << " Params:" << llendl; - for (param_map_t::iterator iter = mVisualParamMap.begin(); - iter != mVisualParamMap.end(); ++iter) + s << " Params:" << "\n"; + for (LLWearable::param_map_t::const_iterator iter = w.mVisualParamMap.begin(); + iter != w.mVisualParamMap.end(); ++iter) { S32 param_id = iter->first; F32 param_weight = iter->second; - llinfos << " " << param_id << " " << param_weight << llendl; + s << " " << param_id << " " << param_weight << "\n"; } - llinfos << " Textures:" << llendl; - for (te_map_t::iterator iter = mTEMap.begin(); - iter != mTEMap.end(); ++iter) + s << " Textures:" << "\n"; + for (LLWearable::te_map_t::const_iterator iter = w.mTEMap.begin(); + iter != w.mTEMap.end(); ++iter) { S32 te = iter->first; - LLUUID& image_id = iter->second; - llinfos << " " << te << " " << image_id << llendl; + const LLUUID& image_id = iter->second; + s << " " << te << " " << image_id << "\n"; } + return s; } diff --git a/linden/indra/newview/llwearable.h b/linden/indra/newview/llwearable.h index 63243eb..977d29b 100644 --- a/linden/indra/newview/llwearable.h +++ b/linden/indra/newview/llwearable.h @@ -118,7 +118,7 @@ public: static void setCurrentDefinitionVersion( S32 version ) { LLWearable::sCurrentDefinitionVersion = version; } - void dump(); + friend std::ostream& operator<<(std::ostream &s, const LLWearable &w); private: static S32 sCurrentDefinitionVersion; // Depends on the current state of the avatar_lad.xml. diff --git a/linden/indra/newview/llwearablelist.cpp b/linden/indra/newview/llwearablelist.cpp index cabf20a..75986c1 100644 --- a/linden/indra/newview/llwearablelist.cpp +++ b/linden/indra/newview/llwearablelist.cpp @@ -57,13 +57,15 @@ struct LLWearableArrivedData mAssetType( asset_type ), mCallback( asset_arrived_callback ), mUserdata( userdata ), - mName( wearable_name ) + mName( wearable_name ), + mRetries(0) {} LLAssetType::EType mAssetType; void (*mCallback)(LLWearable*, void* userdata); void* mUserdata; LLString mName; + S32 mRetries; }; @@ -99,12 +101,12 @@ void LLWearableList::getAsset( const LLAssetID& assetID, const LLString& wearabl // static void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID& uuid, void* userdata, S32 status, LLExtStat ext_status ) { - BOOL success = FALSE; LLWearableArrivedData* data = (LLWearableArrivedData*) userdata; - + LLWearable* wearable = NULL; // NULL indicates failure + if( !filename ) { - llinfos << "Bad Wearable Asset: missing file." << llendl; + LL_WARNS("Wearable") << "Bad Wearable Asset: missing file." << LL_ENDL; } else if( status >= 0 ) @@ -113,38 +115,16 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID LLFILE* fp = LLFile::fopen(filename, "rb"); /*Flawfinder: ignore*/ if( !fp ) { - llinfos << "Bad Wearable Asset: unable to open file: '" << filename << "'" << llendl; + LL_WARNS("Wearable") << "Bad Wearable Asset: unable to open file: '" << filename << "'" << LL_ENDL; } else { - LLWearable *wearable = new LLWearable(uuid); - if( wearable->importFile( fp ) ) - { -// llinfos << "processGetAssetReply()" << llendl; -// wearable->dump(); - - gWearableList.mList[ uuid ] = wearable; - if( data->mCallback ) - { - data->mCallback( wearable, data->mUserdata ); - } - success = TRUE; - } - else + wearable = new LLWearable(uuid); + bool res = wearable->importFile( fp ); + if (!res) { - LLString::format_map_t args; - // *TODO:translate - args["[TYPE]"] = LLAssetType::lookupHumanReadable(data->mAssetType); - if (data->mName.empty()) - { - LLNotifyBox::showXml("FailedToLoadWearableUnnamed", args); - } - else - { - args["[DESC]"] = data->mName; - LLNotifyBox::showXml("FailedToLoadWearable", args); - } delete wearable; + wearable = NULL; } fclose( fp ); @@ -162,44 +142,64 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID } LLViewerStats::getInstance()->incStat( LLViewerStats::ST_DOWNLOAD_FAILED ); - llwarns << "Wearable download failed: " << LLAssetStorage::getErrorString( status ) << " " << uuid << llendl; + LL_WARNS("Wearable") << "Wearable download failed: " << LLAssetStorage::getErrorString( status ) << " " << uuid << LL_ENDL; switch( status ) { case LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE: { - LLString::format_map_t args; - // *TODO:translate - args["[TYPE]"] = LLAssetType::lookupHumanReadable(data->mAssetType); - if (data->mName.empty()) + // Fail + break; + } + default: + { + static const S32 MAX_RETRIES = 3; + if (data->mRetries < MAX_RETRIES) { - LLNotifyBox::showXml("FailedToFindWearableUnnamed", args); + // Try again + data->mRetries++; + gAssetStorage->getAssetData(uuid, + data->mAssetType, + LLWearableList::processGetAssetReply, + userdata); // re-use instead of deleting. + return; } else { - args["[DESC]"] = data->mName; - LLNotifyBox::showXml("FailedToFindWearable", args); + // Fail + break; } - - // Asset does not exist in the database. - // Can't load asset, so return NULL - if( data->mCallback ) - { - data->mCallback( NULL, data->mUserdata ); - } - break; - } - default: - { - // Try again - gAssetStorage->getAssetData(uuid, - data->mAssetType, - LLWearableList::processGetAssetReply, - userdata); // re-use instead of deleting. - return; } } } + if (wearable) // success + { + gWearableList.mList[ uuid ] = wearable; + LL_DEBUGS("Wearable") << "processGetAssetReply()" << LL_ENDL; + LL_DEBUGS("Wearable") << wearable << LL_ENDL; + } + else + { + LLString::format_map_t args; + // *TODO:translate + args["[TYPE]"] = LLAssetType::lookupHumanReadable(data->mAssetType); + if (data->mName.empty()) + { + LLNotifyBox::showXml("FailedToFindWearableUnnamed", args); + } + else + { + args["[DESC]"] = data->mName; + LLNotifyBox::showXml("FailedToFindWearable", args); + } + } + // Always call callback; wearable will be NULL if we failed + { + if( data->mCallback ) + { + data->mCallback( wearable, data->mUserdata ); + } + } delete data; } diff --git a/linden/indra/newview/pipeline.cpp b/linden/indra/newview/pipeline.cpp index 20fd5a7..67bf647 100644 --- a/linden/indra/newview/pipeline.cpp +++ b/linden/indra/newview/pipeline.cpp @@ -108,8 +108,6 @@ //#define DEBUG_INDICES #endif -void render_ui_and_swap_if_needed(); - const F32 BACKLIGHT_DAY_MAGNITUDE_AVATAR = 0.2f; const F32 BACKLIGHT_NIGHT_MAGNITUDE_AVATAR = 0.1f; const F32 BACKLIGHT_DAY_MAGNITUDE_OBJECT = 0.1f; @@ -1546,10 +1544,8 @@ void LLPipeline::shiftObjects(const LLVector3 &offset) assertInitialized(); - //do a swap to indicate an invalid previous frame camera - render_ui_and_swap_if_needed(); glClear(GL_DEPTH_BUFFER_BIT); - gDisplaySwapBuffers = FALSE; + gDepthDirty = FALSE; for (LLDrawable::drawable_vector_t::iterator iter = mShiftList.begin(); iter != mShiftList.end(); iter++) @@ -1974,7 +1970,10 @@ void LLPipeline::postSort(LLCamera& camera) } } - //build render map + //rebuild groups + sCull->assertDrawMapsEmpty(); + + LLSpatialGroup::sNoDelete = FALSE; for (LLCullResult::sg_list_t::iterator i = sCull->beginVisibleGroups(); i != sCull->endVisibleGroups(); ++i) { LLSpatialGroup* group = *i; @@ -1985,6 +1984,18 @@ void LLPipeline::postSort(LLCamera& camera) } group->rebuildGeom(); + } + LLSpatialGroup::sNoDelete = TRUE; + + //build render map + for (LLCullResult::sg_list_t::iterator i = sCull->beginVisibleGroups(); i != sCull->endVisibleGroups(); ++i) + { + LLSpatialGroup* group = *i; + if (sUseOcclusion && + group->isState(LLSpatialGroup::OCCLUDED)) + { + continue; + } for (LLSpatialGroup::draw_map_t::iterator j = group->mDrawMap.begin(); j != group->mDrawMap.end(); ++j) { @@ -2113,6 +2124,8 @@ void LLPipeline::postSort(LLCamera& camera) } func; LLSelectMgr::getInstance()->getSelection()->applyToTEs(&func); } + + LLSpatialGroup::sNoDelete = FALSE; } diff --git a/linden/indra/newview/releasenotes.txt b/linden/indra/newview/releasenotes.txt index 12cd9fb..bbbe693 100644 --- a/linden/indra/newview/releasenotes.txt +++ b/linden/indra/newview/releasenotes.txt @@ -1,40 +1,103 @@ ++------------------------------------------------------+ +| Complete release notes for the | +| Release Candidate Viewer can also be found at | +| http://wiki.secondlife.com/wiki/Beta_Release_Notes | ++------------------------------------------------------+ + +Release Notes for Second Life 1.20(9) May 30th, 2008 +===================================== + +Fixes: +* Fixed: VWR-7335: Revert to non-HTML search for Search>Places in 1.20 +* Fixed: VWR-7322: Chatter's name is not beside chatter's text in Communicate Local Chat (when 'Show Timestamps in chat' is unchecked) +* Fixed: VWR-7342: Linux 1.20(7) libexpat.so.1 not found, exit on load +* Fixed: VWR-6240: Snapshot to disk is not a complete image for a custom size larger than the screen size +* Fixed: VWR-6948: Flexi prims are rendered differently in 1.20 - breaks products +* Fixed: VWR-6107: When uploading animations the Ruth model appears dimly lit and unshaded +* Fixed: VWR-2679: Joystick flycam breaks after switch to fullscreen mode +* Fixed: VWR-1352: A strange copy operation of LLStyle +* Fixed: VWR-6244: Building outlines get dissorted/out of position by one frame when moving the object with SpaceNavigator +* Fixed: VWR-6016: FMOD problem: update3dPosition error +* Fixed: VWR-7234: llcommon/files.lst has two entries for lllog.cpp +* Fixed: Pasting multiline clipboard content into chat loses newlines +* Fixed: RC7 doesnt show the release candidate login screen +* Fixed: RC7 grid selection doesn't persist +* Fixed: Change Linux viewer default compiler from gcc3.4 to gcc4.1 +* Fixed: crash in LLFolderViewFolder::setSelection +* Fixed: Infinite loop in wearables (LLWearableList::processGetAssetReply) causes a crash +* Fixed: Critical message window should not say "Critical message" because it is the Community Standards document +* Fixed: Remove First Use dialogs for sitting and movement key binding during Orientation Island +* Fixed: option to Send Crash Report is not persisting +* Fixed: Increase thread monitoring mainloop timeout from 10 sec to 20 seconds +* Fixed: Default the mini-map to off for new users +* Fixed: Text on Send button for Group IM is right-justified +* Fixed: Region/Estate> Estate tab has a misaligned outline on Estate Managers box +* Fixed: Parcel tag overlaps image on Sell Land floater if longer than 36 characters +* Fixed: crash on LLSurface::resolvePatchRegion() +* Fixed: crash on LLViewerRegion::setCapability +* Fixed: Minor bugfixes to thread monitoring during crashes, purgeAllTextures, and the user setting whether to submit crash reports +* Fixed: Additional thread monitoring tweaks, added a timer to confirm if the watching thread has been hung +* Partial Fix: VWR-1715: Macintosh cyclic short-term freezing of display, getting worse over time; does not respond to commands, eventually change of POV causes crash + +Localization Fixes: +* Fixed: Added new translation strings for German, Korean, Japanese + +Release Notes for Second Life 1.20(8) May 22nd, 2008 +===================================== + +Fixes: +* Fixed: VWR-7347: 'For sale' amounts in objects' Hover Tips show a garbage character +* Fixed: RC7 is unable to buy Linden Dollars +* Fixed: Tuned behavior of thread monitoring (also called watchdog) to deal with extraneous crashing in RC7 +* Fixed: Disabled thread monitoring for Mac and linux versions +* Fixed: Fix the premature start of thread watchdog mainloop timeout + Release Notes for Second Life 1.20(7) May 16th, 2008 ===================================== New features and changes: -* Pasting multiline clipboard content into Chat will show a Paragraph symbol at newlines * Moved "Set Window Size" options from File menu into Preferences > Graphics -* New users are rendered as a cloud, rather than naked, before they choose a gender +* Newly created avatars without a gender, or any avatar where "clothing is still downloading" are rendered as a cloud rather than naked/wrong body shape * Directly interacting with a muted resident will unmute them, with a note logged in the Chat history (VWR-1735) * Fly button is now shown as disabled when you are sitting +* Pasting multiline clipboard content into Chat will show a Paragraph symbol at newlines (Partial Fix behavior) * Group Info > Notices tab explains the storage limits of 200 notices and 14 days * Added OpenGL monitoring via Advanced menu > Rendering > Debug GL option to turn on extra rendering error checking and help reproduce crashes * Added beta support for basic voice lipsync for voice visualization (VWR-4794) - via Advanced menu > Character -* Changed resident names to be interactive in Chat/IM: -** Clicking on resident names in Local Chat will open their Profile page -** Clicking on resident names in a Group IM will open an individual IM +* The 'camera shutter' soundclip/animation plays whenever a new image is acquired by Snapshot Preview (this camera shutter sound indicates, like a real camera, that you have taken a new picture of the world). The sound does not play repeatedly if auto-snapshot is on +* Disabled the Snapshot Preview > Auto-snapshot checkbox, unless Freeze Frame checkbox is set. (This clarifies that Auto-snapshot previously only worked in this case.) + +* Clicking on resident names in Local Chat or in a Group IM will open their Profile page +** The color of clickable resident names uses the same color as URL hyperlinks in chat. These may be changed in Preferences > Text Chat > color picker for "URLs" -* Added four texture constants for referencing in llSetLinkTexture in scripts: -** TEXTURE_BLANK, TEXTURE_DEFAULT, TEXTURE_PLYWOOD and TEXTURE_TRANSPARENT -** Note: Scripts using these constants will run in all Second Life viewers, however previous versions of the viewer will not be able to edit and recompile scripts using the new TEXTURE_BLANK constant; older versions trying to compile such a script will report "(XX,YY) : ERROR : Name not defined within scope." +* Added four texture constants for referencing in llSetLinkTexture: +** TEXTURE_BLANK is the non-transparent blank texture, equivalent to "5748decc-f629-461c-9a36-a35a221fe21f" +** TEXTURE_DEFAULT is the default Media texture, equivalent to "8b5fec65-8d8d-9dc5-cda8-8fdf2716e361" +** TEXTURE_PLYWOOD is the plywood texture, equivalent to "89556747-24cb-43ed-920b-47caed15465f" +** TEXTURE_TRANSPARENT is the default "white transparent" texture, equivalent to "59facb66-4a72-40a2-815c-7d9b42c56f60" +** Note: Scripts using these constants will run smoothly in all Second Life viewers, however previous versions of the viewer will NOT be able to edit and recompile scripts using the new constants. Older versions will report "(XX,YY) : ERROR : Name not defined within scope" when trying to compile such a script. -* Thread monitoring to catch freezes -** A new thread monitor will detect when the viewer application frozen for a period greater than 10 seconds and possibly force a crash with detailed logs +* Thread monitoring to catch freezes: +** A new thread monitor (also referred to as a Watchdog) will detect when the viewer application frozen for a period greater than 10 seconds and possibly force a crash with detailed logs +** Thread monitoring can be disabled by choosing to never report crashes, or with a command line setting "--set WatchdogEnabled 0" +** The threshold timing of the thread monitor is set in the file /app_settings/settings.xml under the key "MainloopTimeoutDefault" * Improved internationalization support: ** Make 'System Default' language option work on Linux and Windows. ** Make unicode system font support good on Linux -* Improvements to Search +* Improvements to Search: ** Search > Popular Places is replaced by a Search > Showcase tab that points to the website Showcase -** Search > Places and Search > Groups use web-based search +** Search > Places, and Search > Groups use web-based search ** Classified ads have a drop-down menu to indicate Mature or Not Mature content Changes: * VWR-4794: Basic voice lipsync for voice visualization -* VWR-4204: Clicking on names in Chat/Group IM history should open Profile page or IM +* VWR-4204: Clicking on names in Chat/Group IM history should open Profile page * VWR-463: Blank is a pre-defined texture in client, but not in LSL * Updated library version for openssl +* Added thread monitoring to the viewer +* Added a setting switch to completely disable thread monitoring * New users are shown as a cloud rather than naked until they choose a gender. * Move "Set Window Size" options from File menu into Preferences > Graphics * Make clothing-still-downloading dialog into an ignorable alert dialog @@ -44,6 +107,8 @@ Changes: * Convert Search > Group tab to use HTML search * Search: Require Mature/Not Mature in Classifieds * Make strict GL debugging toggleable on-the-fly via Advanced menu > Rendering > Debug GL option - turns on extra rendering error checking and help reproduce crashes +* The 'camera shutter' soundclip/animation plays whenever a new image is acquired by Snapshot Preview, but not repeatedly if auto-snapshot is on +* Disabled the Snapshot Preview > Auto-snapshot checkbox, unless Freeze Frame checkbox is set Fixes: * Fixed: VWR-104: Unused class LLVertexProgramGL should be removed @@ -63,12 +128,17 @@ Fixes: * Fixed: VWR-3857: Script (LSL) editor shows non Latin 1 characters as square boxes * Fixed: VWR-2275: Linux 1.18.3 Won't Link * Fixed: VWR-3813: gtk_check_version() API changed to return const gchar * - causes gcc ERROR +* Fixed: VWR-1735: Directly interacting with a muted resident should unmute them +* Fixed: VWR-2142: Parcel voice icon doesn't reflect disabled status if voice isn't used +* Fixed: VWR-5853: Double-Clicking on vertical edge of Inventory/Gesture window destroys the floating window. +* Fixed: VWR-2448: Snapshot Preview tool should respect 'Quiet Snapshots to Disk' * Fixed: llrender.cpp export +* Fixed: Clean up log messages in viewer to make crash logs more readable and useful * Fixed: Create secondlife:///app/ URL to open my groups panel * Fixed: Create secondlife:///app/ URL to open create groups dialog * Fixed: Display a message if LLWebBrowserCtrl blocks a secondlife:///app/* url * Fixed: Abstract common glTexParameter calls -* Fixed: Orientation Island HUD select language texture is wrong for English in 1.20 +* Fixed: Orientation Island HUD select language texture is wrong for English version in 1.20 * Fixed: Double-clicking border of communicate window makes window unrecoverable * Fixed: Command line parser bug parsing "--multiple true" at beginning of a command line. * Fixed: --loginuri is not being handled correctly @@ -76,15 +146,13 @@ Fixes: * Fixed: crash in LLMediaImplQuickTime::load * Fixed: crash on LLViewerParcelMedia::update * Fixed: Pop-up menu width should try to accomodate the longest menu item (within reason) -* Fixed: VWR-1735: Directly interacting with a muted resident should unmute them -* Fixed: VWR-2142: Parcel voice icon doesn't reflect disabled status if voice isn't used -* Fixed: VWR-5853: Double-Clicking on vertical edge of Inventory/Gesture window destroys the floating window. -* Fixed: VWR-2448: Snapshot Preview tool should respect 'Quiet Snapshots to Disk' * Fixed: Can't change values with debug settings floater * Fixed: Focus > Zoom button can't be re-selected * Fixed: Debug Permissions displays overlap * Fixed: Objects with no group tagging show group tags of previously clicked items * Fixed: stop bundling libexpat with the linux viewer +* Fixed: World Map's keyboard focus that jumps from Landmarks to Teleport is broken in 1.20 +* Fixed: text results for Search > People is displayed as white text * Partial Fix: Pasting multiline clipboard content into chat loses newlines Localization Fixes: @@ -334,141 +402,3 @@ Source changes: * VWR-2645: Source typo RELEASE_FOR_DOWNLOAD should be LL_RELEASE_FOR_DOWNLOAD ? * Fixed: g++ 4 viewer compile issues * Dead code removal createLegacyWearableFromAvatar - - -Release Notes for Second Life 1.19.0(4) February 28th, 2008 -===================================== -New features and changes: -* Voice -** Voice Chat is now enabled by default to allow Residents to hear other Residents. -** A microphone is required to speak to other Residents. -** Push-to-Talk is the default mode for transmitting voice. -** These settings can be modified via the Voice Chat tab of the Preferences dialog. - -* Age Verification: -** The user interface for parcel and estate access has been clarified and improved. -** Added the ability to restrict access to parcels and estates to age verified adults. -** Removed the ability to *ban* access to Residents who have provided payment info or who have used payment info. We continue to support the ability to *allow* access to only those who have provided payment info. - -* Crash Reporter -** The crash reporting mechanism has been improved. Following a crash, more useful information will be sent and reports should now take less than 10 seconds. - -* VWR-210: Voice Support on Linux (EXPERIMENTAL) - see README-linux-voice.txt - -* Other changes: -** Change alert message that pops up when you set Busy -** Add "Teleporting from SLURL to SLURL" to the chat history to provide quick and dirty "back" links -** Print the name of the missing gesture in the error message -** Remove "New Account..." and "Preferences" buttons from login screen for 1.19.0 - -Fixes: -* SVC-930: Prims set for sale - prices are incorrectly set when multiple prims taken to inventory and rezzed -* SVC-1125: New Search: Beacons aren't shown when teleporting to regions with "Allow Direct Teleport" disabled -* VWR-1125: Clicking Title Bar While Mouselook'd Repositions SL Window -* VWR-1137: Inventory names out of sync after renaming via Properties window -* VWR-1145: Unable To Connect help not available -* VWR-1162: Land for sale includes L$1 parcels that are not actually for sale -* VWR-1350: Color settings do not appear to be applied to LSL default text -* VWR-1475: OpenJPEG always uploads single layer lossless images -* VWR-1590: Keyboard changes inventory selection after right-click -* VWR-1627: Classified metrics are reset to 0 when the ad is updated -* VWR-1651: Add ability to open a partners profile whilst viewing an avatar's profile -* VWR-1774: Some avatar positions result in no Z-axis arrow when editing attachments -* VWR-1873: Typos in en-us locale file -* VWR-1919: Remove texture UUID information from UI unless full-perm -* VWR-2030: Avatar only turns half-way in Appearance Mode -* VWR-2142: Parcel voice icon doesn't reflect disabled status if voice isn't used -* VWR-2256: Mac updater directory permission issues -* VWR-2367: Wrong handling of maximum length of Group Notice message -* VWR-2404: lossless texture compression on small textures not lossless -* VWR-2410: noise dot appear in chat window when clien running long with chatting. -* VWR-2411: Possible crash in pipeline.cpp -* VWR-2412: Possible crash drawpoolwater -* VWR-2421: ATI Radeon HD 2900 XT + Second Life = "Couldn't match GPU to a class","Setting GPU Class to Class0" -* VWR-2483: the macviewer.xcodeprj file doesn't create stripped binaries on Deployment or Universal -* VWR-250: Preedit (composition) strings are shown poorly when typing Japanese text on Windows -* VWR-2550: Scuplty vertex coordinates are size/256 meters too small on the positive faces -* VWR-2614: gActiveChannelSpeakerMgr not deleted at end of program in viewer.cpp -* VWR-2617: Adds LLSD support to flex/light/sculpt params for primitives -* VWR-2652: Changes needed to compile viewer against lastest libopenjpeg2000 -* VWR-2684: Minor leak in floaters using layoutstacks -* VWR-2722: Muting an object with pie menu only mutes the prim you select, not entire linkset -* VWR-2847: Wrong hover text in Japanese UI -* VWR-2854: Some sculpted prims render as balls on close zoom, which look fine in older clients -* VWR-2867: Eyes rotate unnaturally around their X axis. Clockwise/Counter-Clockwise -* VWR-289: URLs for video media streaming need to be URL-encoded or stream doesn't work -* VWR-2959: Windows (Visual Studio) solution file refers to a non-existing project "build_all" -* VWR-3088: Unchecking "Automatic Appearance Camera Movement" no longer has any effect -* VWR-3206: OpenJPEG svn478 causes slviewer to crash -* VWR-3428: Checking a users profile while editing a linked set causes viewer crash -* VWR-3458: Mouse cursor background is opaque white instead of transparent on big endian systems -* VWR-3558: llLoadURL cannot be muted -* VWR-356: Move delete to the bottom of context menus, separated by spacer -* VWR-3748: Builds fail on 1.18.6 RC if not using MOZLIB due to missing #if LL_LIBXUL_ENABLED in 3 places in indra/newview/llpanellogin.cpp -* VWR-3948: Underlayers no longer removable by pie menu in Windlight, release candidates -* VWR-412: Object editing arrows hidden but clickable on objects you can't edit. -* dialogs have extra vertical space -* Photo Album: name in Properties cut off some Japanese characters -* New gestures do not appear active in inventory -* Make parcel name in menu "look" active -* "Wear" pie option shows up for many objects even if resident does not own and cannot wear them. -* Textures on no-transfer objects can be transferred -* Deleted gestures still work -* Inventory description out of sync after renaming via Properties window -* Show private estate tiles when World Map is zoomed out -* Properties description not updated when preview description updated -* Buying object contents broken -* Improve window opening behavior, ensuring it is mostly on screen -* No-modify objects can be modified through Open pane -* Inventory names out of sync after renaming via Properties -* Japanese IME mode should be set and postiion of any input windows fixed for non-Japanese fields -* ctrl-shift-w doesn't work if no windows have focus -* Avatar falling in place - Alliez Mysterio -* Linux crash reporter does not run on next execution after forcing an infinite loop and forcefully exiting -* hitting enter should immediately set the value of a field -* Inventory Folder Loading state not clearly indicated -* Add warning dialog to the Land Sale process to warn against selling land to Anyone -* Legacy flossexception link needs to be fixed in source -* make link from client log in window to "Forgot Password" page -* Remove button under estate managers list enables after estate manager clicks in the list -* Changing search field should cancel current selection -* Estate tab within Tools / Region Estate has wrong settings for enable of Restrict Access upon initialization -* llEscapeURL and llUnescapeURL caps output to 255 characters -* XUI LoadFromXML function doesn't work -* Sanitize floater sizing behavior when SL window is made very small -* Animation won't stop if avatar teleports while animated -* Can't paste name of object into View > Mute List > Mute object by name -* pressing ctrl-F10 then Escape causes keyboard to be unresponsive -* Make SL viewer updater show a progress bar so that people know how long to wait -* Can't double-click on groups in profile after changing your active title -* Getting multiple copies of texture dragged onto prim -* blue dialog's 'next' widget steals focus -* Audio should be encoded for upload at a 'good enough' quality rather than a user-selected bitrate -* multiple preview windows open for a single texture/snapshot saved inside a note card -* Enhance Viewer to support new Age Verification feature -* Rename crash setting to cause crash logger to come up for all residents -* Change crash logger "Remember this choice" function to default to on -* Rework Ban tab of floater_about_land -* Windows IME positioning fixed -* Viewer crashes in assert when playing Sword Strike animation -* Unable to set 'Group Access' for land that is also 'Public Access' (Was VWR-3667) -* Disable QuickTime when the installed version is less than version with RTSP exploit -* Korean viewer crashes on startup -* Move fullscreen message from login screen to viewer prefs -* linux client doesn't recognise that a viewer is already running (slurl crapout) -* Search results window displays "s..." and "n..." instead of "searching..." and "none found" -* QuickTime disabled message can not be ignored -* Crash on login page when using Logitech LCD Keyboard -* SEC-17 Ability to Access Sculpted Prim Textures from Database without owning actual sculpt texture, allowing for people to "steal" sculpts. -* info window does not pop up when transitioning from a Havok1 to Havok4 region -* Repoint Report Bug... Viewer link to Pjira -* Upload Animation window: Button missing in Stopped window state - -Source changes: -* Upgrade Win32 libvorbis to v1.2 -* VWR-2881: Bundled Mesa libs are not GPL compatible -* upgrade in-tree Linux GL headers to Mesa 7.x -* upgrade in-tree Win32 GL headers to version without SGI Free B license -* Rebuild and/or update libraries to use statically linked libs. -* Remove llfloaterhtmlhelp.cpp / h and floater_html_help.xml - diff --git a/linden/indra/newview/skins/xui/de/alerts.xml b/linden/indra/newview/skins/xui/de/alerts.xml index 6a5635a..dcaaa0e 100644 --- a/linden/indra/newview/skins/xui/de/alerts.xml +++ b/linden/indra/newview/skins/xui/de/alerts.xml @@ -749,6 +749,9 @@ Sollte das Problem fortbestehen, finden Sie weitere Hilfestellung unter: http:// MINDESTANF. Die Seite [_URL] für weitere Informationen öffnen? + + Nicht unterstützte Hardware ignorieren + @@ -781,6 +784,18 @@ Die Seite [_URL] für weitere Informationen öffnen? 510 + + + Ihr System verwendet eine uns zurzeit unbekannte Grafikkarte. +Dies ist häufig der Fall bei neuer Hardware, die wir noch nicht testen konnten. +Second Life funktioniert aller Voraussicht nach normal, möglicherweise +müssen Sie aber die Grafikeinstellungen anpassen. +(Bearbeiten > Einstellungen > Grafik). + + + Unbekannte Grafikkarte ignorieren + + [AVATAR_NAME] einfrieren? @@ -1388,6 +1403,34 @@ Bitte wählen Sie einen männlichen oder weiblichen Avatar. Problem beim Hinzufügen zu dieser Grundstücksliste. Bei mindestens einem Grundstück ist die Liste voll. + + + Enthält diese Anzeige nicht jugendfreie Inhalte? + + + + + + + + Beschäftigt sich diese Gruppe mit nicht jugendfreien Inhalten? + + + + + Wenn Sie diese Option auswählen, können Parzelleneigentümer ihre Parzellen nicht in der Suche anzeigen lassen @@ -1494,8 +1537,7 @@ Sie dieses Objekt anbieten? - Sie sind nicht berechtigt, die ausgewählten - Objekte zu kopieren. + Sie sind nicht berechtigt, die ausgewählten Objekte zu kopieren. @@ -2670,10 +2712,12 @@ Sie wurden zur nächstgelegenen Region teleportiert. - Ihre Kleidung wird noch heruntergeladen. -Sie können sich in der Welt normal verhalten und andere -Einwohner können Sie sehen. + Ihre Kleidung wird noch heruntergeladen. +Sie können [SECOND_LIFE] normal verwenden. Andere Benutzer können Sie korrekt dargestellt sehen. + + Wenn das Herunterladen von Kleidung lange dauert + @@ -4583,7 +4627,7 @@ zu erleichtern, oder testen Sie sie, indem Sie sie in die Adressleiste Ihres Bro - Die Optionen in diesem Dialog steuern Fenstergröße und Auflösung sowie die Qualität der Grafikdarstellung auf dem Client. Vier grundlegende Grafikeinstellungen stehen zur Wahl: Niedrig, Mittel, Hoch und Ultra. Wenn Sie das Kontrollkästchen "Benutzerdefiniert" anklicken, können Sie folgende Grafikeinstellungen selbst vornehmen: + Die Optionen in diesem Dialog steuern Fenstergröße und Auflösung sowie die Qualität der Grafikdarstellung im Client. Im Fenster 'Einstellungen' > 'Grafik' stehen vier Grafikeinstellungen zur Wahl: Niedrig, Mittel, Hoch und Ultra. Die Grafikeinstellungen lassen sich auch individuell anpassen; aktivieren Sie das Kontrollkästchen 'Benutzerdefiniert', um die folgenden Einstellungen zu bearbeiten: Shader: Aktivieren oder deaktivieren Sie die verschiedenen Pixel-Shader. @@ -4597,11 +4641,11 @@ Max. Partikelzahl: Legt fest, wie viele Partikel gleichzeitig berechnet und ange Post-Processing-Qualität: Legt fest, mit welcher Auflösung der Glüheffekt berechnet wird. -Gitterdetails: Legt den Detailgrad bei der Berechnung bestimmter Objekte fest. +Gitterdetails: Legt den Detailgrad bzw. die Anzahl an Dreiecken bei der Berechnung bestimmter Objekte fest. Höhere Werte führen zu einer genaueren Darstellung, dauern aber länger in der Berechnung. Beleuchtungsdetails: Legt fest, welche Lichtquellen berechnet werden. -Terraindetails: Legt den Detailgrad bei der Berechnung des Terrains fest. +Terraindetails: Legt den Detailgrad bei der Berechnung der Terraintextur fest. @@ -5044,4 +5088,9 @@ Möchten Sie die Second Life Website öffnen, um diese Angaben zu hinterlegen? Nein + + + Der String [STRING_NAME] fehlt in strings.xml + + diff --git a/linden/indra/newview/skins/xui/de/floater_directory.xml b/linden/indra/newview/skins/xui/de/floater_directory.xml index 506ed19..c149fb4 100644 --- a/linden/indra/newview/skins/xui/de/floater_directory.xml +++ b/linden/indra/newview/skins/xui/de/floater_directory.xml @@ -222,8 +222,7 @@