diff --git a/.hgtags b/.hgtags index d32bea3d9f..43c50d422d 100755 --- a/.hgtags +++ b/.hgtags @@ -589,3 +589,4 @@ a3143db58a0f6b005232bf9018e7fef17ff9ec90 6.1.0-release 50f0ece62ddb5a244ecb6d00ef5a89d80ad50efa 6.1.1-release 82a89165e5929a6c3073d6cd60a543cb395f147b 6.2.0-release 706bdc7e25c6e6b8fb56f4a13fcce2936e70a79c 6.2.1-release +ec09daf1899c1c01c4ba0ba950fae572f2a612a8 6.2.2-release diff --git a/autobuild.xml b/autobuild.xml index 81038c104f..af8af36969 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1006,11 +1006,11 @@ archive hash - d10a431d6dbd90f4ab900e4650e65b5c + 33d23a2167b58bd880f2cd3ce63501d7 hash_algorithm md5 url - file:///opt/firestorm/fmodstudio-1.10.12-darwin-190751902.tar.bz2 + file:///opt/firestorm/fmodstudio-1.10.13-darwin-191311419.tar.bz2 name darwin @@ -1034,11 +1034,11 @@ archive hash - 30795e5ffa33613fa6397c9e33d18e42 + d1ef7f3d30bf2126620a37630b615ecf hash_algorithm md5 url - file:///opt/firestorm/fmodstudio-1.10.12-linux64-190751836.tar.bz2 + file:///opt/firestorm/fmodstudio-1.10.13-linux64-191311416.tar.bz2 name linux64 @@ -1048,11 +1048,11 @@ archive hash - 35fe52bc6b78ed954fe649c31df13a3c + 9aa1b6789b0f30943599f48c0fedefa1 hash_algorithm md5 url - file:///c:/cygwin/opt/firestorm/fmodstudio-1.10.12-windows-190751143.tar.bz2 + file:///c:/cygwin/opt/firestorm/fmodstudio-1.10.13-windows-191311251.tar.bz2 name windows @@ -1062,18 +1062,18 @@ archive hash - 9329deb7581ed08b52a694975de2ae54 + 7e6e5b4bc012e0f91c71c481aa4657fb hash_algorithm md5 url - file:///c:/cygwin/opt/firestorm/fmodstudio-1.10.12-windows64-190751144.tar.bz2 + file:///c:/cygwin/opt/firestorm/fmodstudio-1.10.13-windows64-191311303.tar.bz2 name windows64 version - 1.10.12 + 1.10.13 fmodex diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index cac71bb825..81e6c3ac26 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -36,6 +36,11 @@ else (OPENSIM) endif() message("compiling without OpenSim support") endif (OPENSIM) + +if (HAVOK_TPV) + add_definitions(-DHAVOK_TPV=1) + message("compiling with Havok libraries") +endif (HAVOK_TPV) # # Support for test builds diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index b74990ce7d..ea98beedb6 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -221,7 +221,7 @@ set(USE_PRECOMPILED_HEADERS ON CACHE BOOL "Enable use of precompiled header dire # When using Havok, we have to turn OpenSim support off if( HAVOK_TPV ) if( OPENSIM ) - message( "Compiling with Havok libraries, disabling OpenSim support" ) + message( "compiling with Havok libraries, disabling OpenSim support" ) endif( OPENSIM ) set( OPENSIM OFF ) diff --git a/indra/llimage/llimagebmp.cpp b/indra/llimage/llimagebmp.cpp index a5ea5935dc..763f5a3328 100644 --- a/indra/llimage/llimagebmp.cpp +++ b/indra/llimage/llimagebmp.cpp @@ -181,7 +181,7 @@ bool LLImageBMP::updateData() } } else - if( 12 <= header.mSize && 64 <= header.mSize ) + if( 12 <= header.mSize && header.mSize <= 64 ) { setLastError("OS/2 2.x BMP files are not supported"); return false; diff --git a/indra/llmath/lloctree.h b/indra/llmath/lloctree.h index e1885064b5..e755f8d21d 100644 --- a/indra/llmath/lloctree.h +++ b/indra/llmath/lloctree.h @@ -433,7 +433,7 @@ public: } } #ifndef OPENSIM // FIRE-11593: Opensim "4096 Bug" Fix by Latif Khalifa - else + else if (parent) { //it's not in here, give it to the root OCT_ERRS << "Octree insertion failed, starting over from root!" << LL_ENDL; @@ -448,6 +448,13 @@ public: node->insert(data); } + else + { + // It's not in here, and we are root. + // LLOctreeRoot::insert() should have expanded + // root by now, something is wrong + OCT_ERRS << "Octree insertion failed! Root expansion failed." << LL_ENDL; + } #endif // FIRE-11593: Opensim "4096 Bug" Fix by Latif Khalifa return false; @@ -800,10 +807,15 @@ public: { LLOctreeNode::insert(data); } - else + else if (node->isInside(data->getPositionGroup())) { node->insert(data); } + else + { + // calling node->insert(data) will return us to root + OCT_ERRS << "Failed to insert data at child node" << LL_ENDL; + } } else if (this->getChildCount() == 0) { diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index 58621b3a32..9868718c27 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -391,7 +391,10 @@ void callWindowFocus() void callWindowUnfocus() { - gWindowImplementation->getCallbacks()->handleFocusLost(gWindowImplementation); + if ( gWindowImplementation && gWindowImplementation->getCallbacks() ) + { + gWindowImplementation->getCallbacks()->handleFocusLost(gWindowImplementation); + } } void callWindowHide() diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index ca06394388..bee9433817 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -6.2.2 +6.2.3 diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index ee1a5c972d..bc7aa1e60c 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -2055,7 +2055,7 @@ bool LLAppViewer::cleanup() // FIRE-8385 Crash on exit in Havok. It is hard to say why it happens, as we only have the binary Havok blob. This is a hack around it. // Due to the fact the process is going to die anyway, the OS will clean up any reources left by not calling quitSystem. // The OpenSim version does not use Havok, it is okay to call shutdown then. -#ifdef OPENSIM +#ifndef HAVOK_TPV // shut down Havok LLPhysicsExtensions::quitSystem(); #endif // @@ -3684,10 +3684,12 @@ LLSD LLAppViewer::getViewerInfo() const //} // FIRE-8273: Add Open-sim indicator to About floater -#ifdef OPENSIM +#if defined OPENSIM info["BUILD_TYPE"] = LLTrans::getString("FSWithOpensim"); -#else +#elif defined HAVOK_TPV info["BUILD_TYPE"] = LLTrans::getString("FSWithHavok"); +#else + info["BUILD_TYPE"] = std::string(); #endif // OPENSIM // info["SKIN"] = gSavedSettings.getString("FSInternalSkinCurrent"); @@ -3728,20 +3730,15 @@ LLSD LLAppViewer::getViewerInfo() const } // return a URL to the release notes for this viewer, such as: - // http://wiki.secondlife.com/wiki/Release_Notes/Second Life Beta Viewer/2.1.0.123456 + // https://releasenotes.secondlife.com/viewer/2.1.0.123456.html std::string url = LLTrans::getString("RELEASE_NOTES_BASE_URL"); // FIRE-13993: Leave out channel so we can use a URL like // http://wiki.phoenixviewer.com/firestorm_change_log_x.y.z.rev //if (! LLStringUtil::endsWith(url, "/")) // url += "/"; - //std::string channel = LLVersionInfo::getChannel(); - //if (LLStringUtil::endsWith(boost::to_lower_copy(channel), " edu")) // Release Notes url shouldn't include the EDU parameter - //{ - // boost::erase_tail(channel, 4); - //} - //url += LLURI::escape(channel) + "/"; - // + //url += LLURI::escape(LLVersionInfo::getVersion()) + ".html"; url += LLURI::escape(LLVersionInfo::getVersion()); + // info["VIEWER_RELEASE_NOTES_URL"] = url; diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 634565f087..c2bf55bedf 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -418,13 +418,16 @@ BOOL LLFloaterModelPreview::postBuild() // TODO: Opensim: Set it to something reasonable validate_url = LLGridManager::getInstance()->getLoginPage(); } +#endif // OPENSIM // + // Show an alert dialog if using the Opensim viewer as functionality will be limited without Havok +#ifndef HAVOK_TPV LLSD args; args["FEATURE"] = getString("no_havok"); LLNotificationsUtil::add("NoHavok", args); +#endif // -#endif // OPENSIM getChild("warning_message")->setTextArg("[VURL]", validate_url); diff --git a/indra/newview/llfloaterpathfindingconsole.cpp b/indra/newview/llfloaterpathfindingconsole.cpp index 74d60ed234..943e3baa89 100644 --- a/indra/newview/llfloaterpathfindingconsole.cpp +++ b/indra/newview/llfloaterpathfindingconsole.cpp @@ -58,7 +58,7 @@ #include "pipeline.h" // For NoHavok alert -#ifdef OPENSIM +#ifndef HAVOK_TPV #include "llnotificationsutil.h" #endif // OPENSIM // @@ -251,7 +251,7 @@ void LLFloaterPathfindingConsole::onOpen(const LLSD& pKey) switchIntoTestPathMode(); } // Show an alert dialog if using the Opensim viewer as functionality will be limited without Havok -#ifdef OPENSIM +#ifndef HAVOK_TPV LLSD args; args["FEATURE"] = getString("no_havok"); LLNotificationsUtil::add("NoHavok", args); diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index fe67f0172d..2df3b58b0f 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -63,9 +63,9 @@ #include const S32 LOGIN_MAX_RETRIES = 3; -const F32 LOGIN_SRV_TIMEOUT_MIN = 10; -const F32 LOGIN_SRV_TIMEOUT_MAX = 120; -const F32 LOGIN_DNS_TIMEOUT_FACTOR = 0.9; // make DNS wait shorter then retry time +const F32 LOGIN_SRV_TIMEOUT_MIN = 10.f; +const F32 LOGIN_SRV_TIMEOUT_MAX = 120.f; +const F32 LOGIN_DNS_TIMEOUT_FACTOR = 0.9f; // make DNS wait shorter then retry time class LLLoginInstance::Disposable { public: diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 6afa18ac3a..791fe1977f 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -4583,6 +4583,19 @@ LLMeshCostData::LLMeshCostData() std::fill(mEstTrisByLOD.begin(), mEstTrisByLOD.end(), 0.f); } +// Guard against medium/low/lowest LOD missing and crashing the viewer +S32 getSize( std::string aLOD, const LLSD &aHeader ) +{ + if( !aHeader.has( aLOD ) ) + return 0; + + if( !aHeader[ aLOD ].has( "size" ) ) + return 0; + + return aHeader[ aLOD ][ "size" ].asInteger(); +} +// + bool LLMeshCostData::init(const LLSD& header) { mSizeByLOD.resize(4); @@ -4590,23 +4603,42 @@ bool LLMeshCostData::init(const LLSD& header) std::fill(mSizeByLOD.begin(), mSizeByLOD.end(), 0); std::fill(mEstTrisByLOD.begin(), mEstTrisByLOD.end(), 0.f); + + // Guard against medium/low/lowest LOD missing and crashing the viewer + + // S32 bytes_high = header["high_lod"]["size"].asInteger(); + // S32 bytes_med = header["medium_lod"]["size"].asInteger(); + // if (bytes_med == 0) + // { + // bytes_med = bytes_high; + // } + // S32 bytes_low = header["low_lod"]["size"].asInteger(); + // if (bytes_low == 0) + // { + // bytes_low = bytes_med; + // } + // S32 bytes_lowest = header["lowest_lod"]["size"].asInteger(); + // if (bytes_lowest == 0) + // { + // bytes_lowest = bytes_low; + // } + + S32 bytes_high = getSize( "high_lod", header ), + bytes_med = getSize( "medium_lod", header ), + bytes_low = getSize( "low_lod", header ), + bytes_lowest = getSize( "lowest_lod", header ); - S32 bytes_high = header["high_lod"]["size"].asInteger(); - S32 bytes_med = header["medium_lod"]["size"].asInteger(); if (bytes_med == 0) - { bytes_med = bytes_high; - } - S32 bytes_low = header["low_lod"]["size"].asInteger(); + if (bytes_low == 0) - { bytes_low = bytes_med; - } - S32 bytes_lowest = header["lowest_lod"]["size"].asInteger(); + if (bytes_lowest == 0) - { bytes_lowest = bytes_low; - } + + // + mSizeByLOD[0] = bytes_lowest; mSizeByLOD[1] = bytes_low; mSizeByLOD[2] = bytes_med; diff --git a/indra/newview/llsearchableui.cpp b/indra/newview/llsearchableui.cpp index 93143eb33f..bbaf20ab30 100644 --- a/indra/newview/llsearchableui.cpp +++ b/indra/newview/llsearchableui.cpp @@ -70,10 +70,12 @@ bool ll::prefs::PanelData::hightlightAndHide( LLWString const &aFilter ) for( tSearchableItemList::iterator itr = mChildren.begin(); itr != mChildren.end(); ++itr ) (*itr)->setNotHighlighted( ); - if (aFilter.empty()) - { - return true; - } + // FIRE-23969: This breaks prefs search - and isn't needed on FS + //if (aFilter.empty()) + //{ + // return true; + //} + // bool bVisible(false); for( tSearchableItemList::iterator itr = mChildren.begin(); itr != mChildren.end(); ++itr ) diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 85cdffff26..adf42be6b4 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -120,25 +120,9 @@ BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask) mMouseOutsideSlop = FALSE; mMouseDownX = x; mMouseDownY = y; - LLTimer pick_timer; - BOOL pick_rigged = false; //gSavedSettings.getBOOL("AnimatedObjectsAllowLeftClick"); - mPick = gViewerWindow->pickImmediate(x, y, FALSE, pick_rigged); - LLViewerObject *object = mPick.getObject(); - LLViewerObject *parent = object ? object->getRootEdit() : NULL; - if (!object - || object->isAttachment() - || object->getClickAction() == CLICK_ACTION_DISABLED - || (!useClickAction(mask, object, parent) && !object->flagHandleTouch() && !(parent && parent->flagHandleTouch()))) - { - // Unless we are hovering over actionable visible object - // left mouse down always picks transparent (but see handleMouseUp). - // Also see LLToolPie::handleHover() - priorities are a bit different there. - // Todo: we need a more consistent set of rules to work with - mPick = gViewerWindow->pickImmediate(x, y, TRUE /*transparent*/, pick_rigged); - } - //LL_INFOS() << "pick_rigged is " << (S32) pick_rigged << " pick time elapsed " << pick_timer.getElapsedTimeF32() << LL_ENDL; // Clean up log spam left over from SL-713, MAINT-7709. - LL_DEBUGS() << "pick_rigged is " << (S32) pick_rigged << " pick time elapsed " << pick_timer.getElapsedTimeF32() << LL_ENDL; + //left mouse down always picks transparent (but see handleMouseUp) + mPick = gViewerWindow->pickImmediate(x, y, TRUE, FALSE); mPick.mKeyMask = mask; mMouseButtonDown = true; diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index 6e8caa77d3..f5c37db304 100644 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -51,6 +51,7 @@ // library includes #include "llnotificationsutil.h" #include "llsd.h" +#include "stringize.h" #include "fsfloaterplacedetails.h" @@ -313,14 +314,23 @@ void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const LLSLURL& // Teleportation links are handled here because they are tightly coupled // to SLURL parsing and sim-fragment parsing -class LLTeleportHandler : public LLCommandHandler +class LLTeleportHandler : public LLCommandHandler, public LLEventAPI { public: // Teleport requests *must* come from a trusted browser // inside the app, otherwise a malicious web page could // cause a constant teleport loop. JC - LLTeleportHandler() : LLCommandHandler("teleport", UNTRUSTED_THROTTLE) { } - + LLTeleportHandler() : + LLCommandHandler("teleport", UNTRUSTED_THROTTLE), + LLEventAPI("LLTeleportHandler", "Low-level teleport API") + { + LLEventAPI::add("teleport", + "Teleport to specified [\"regionname\"] at\n" + "specified region-relative [\"x\"], [\"y\"], [\"z\"].\n" + "If [\"regionname\"] omitted, teleport to GLOBAL\n" + "coordinates [\"x\"], [\"y\"], [\"z\"].", + &LLTeleportHandler::from_event); + } bool handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web) @@ -396,6 +406,41 @@ public: return true; } + void from_event(const LLSD& params) const + { + Response response(LLSD(), params); + if (params.has("regionname")) + { + // region specified, coordinates (if any) are region-local + LLVector3 local_pos( + params.has("x")? params["x"].asReal() : 128, + params.has("y")? params["y"].asReal() : 128, + params.has("z")? params["z"].asReal() : 0); + std::string regionname(params["regionname"]); + std::string destination(LLSLURL(regionname, local_pos).getSLURLString()); + // have to resolve region's global coordinates first + teleport_via_slapp(regionname, destination); + response["message"] = "Teleporting to " + destination; + } + else // no regionname + { + // coordinates are global, and at least (x, y) are required + if (! (params.has("x") && params.has("y"))) + { + return response.error("Specify either regionname or global (x, y)"); + } + LLVector3d global_pos(params["x"].asReal(), params["y"].asReal(), + params["z"].asReal()); + gAgent.teleportViaLocation(global_pos); + LLFloaterWorldMap* instance = LLFloaterWorldMap::getInstance(); + if (instance) + { + instance->trackLocation(global_pos); + } + response["message"] = STRINGIZE("Teleporting to global " << global_pos); + } + } + static void teleport_via_slapp(std::string region_name, std::string callback_url) { diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 00d87bdfd6..398f85a765 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -1059,14 +1059,9 @@ void LLWorldMapView::drawFrustum() F32 half_width_pixels = half_width_meters * meters_to_pixels; // Compute the frustum coordinates. Take the UI scale into account. -#if defined(LL_DARWIN) - F32 ui_scale_factor = gSavedSettings.getF32("UIScaleFactor"); - F32 ctr_x = ((getLocalRect().getWidth() * 0.5f + sPanX) * ui_scale_factor) * LLUI::getScaleFactor().mV[VX]; - F32 ctr_y = ((getLocalRect().getHeight() * 0.5f + sPanY) * ui_scale_factor) * LLUI::getScaleFactor().mV[VY]; -#else F32 ctr_x = ((getLocalRect().getWidth() * 0.5f + sPanX) * LLUI::getScaleFactor().mV[VX]); F32 ctr_y = ((getLocalRect().getHeight() * 0.5f + sPanY) * LLUI::getScaleFactor().mV[VY]); -#endif + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml index 03fb4aa472..ceeaf8e94f 100644 --- a/indra/newview/skins/default/xui/da/strings.xml +++ b/indra/newview/skins/default/xui/da/strings.xml @@ -430,7 +430,7 @@ Prøv venligst om lidt igen. diff --git a/indra/newview/skins/default/xui/de/floater_model_preview.xml b/indra/newview/skins/default/xui/de/floater_model_preview.xml index a69839dcd1..4ffc7e76f8 100644 --- a/indra/newview/skins/default/xui/de/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/de/floater_model_preview.xml @@ -306,7 +306,7 @@ - Z-Offset (Avatar anheben oder senken): + Z-Offset (Av. anheben / senken): diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index 2bde65eac7..0ae32ba0f9 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -783,7 +783,7 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 0b9f8eb34a..d439c0d416 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -656,7 +656,7 @@ Intenta iniciar sesión de nuevo en unos instantes. diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 598c0d4b8f..76008fdfba 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -627,7 +627,7 @@ Veuillez réessayer de vous connecter dans une minute. diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index bc3dce1d0a..d1bdc7cf36 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -582,7 +582,7 @@ support@secondlife.com にお問い合わせください。 diff --git a/indra/newview/skins/default/xui/pl/floater_bulk_perms.xml b/indra/newview/skins/default/xui/pl/floater_bulk_perms.xml index d55baf5bc2..d97a4907fe 100644 --- a/indra/newview/skins/default/xui/pl/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/pl/floater_bulk_perms.xml @@ -24,22 +24,22 @@