diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm index 43e1fafa83..7d54bdaee2 100644 --- a/indra/llwindow/llwindowmacosx-objc.mm +++ b/indra/llwindow/llwindowmacosx-objc.mm @@ -407,7 +407,7 @@ void allowDirectMarkedTextInput(bool allow, GLViewRef glView) NSWindowRef getMainAppWindow() { - LLNSWindow *winRef = [(LLAppDelegate*)[[LLNSApplication sharedApplication] delegate] window]; + LLNSWindow *winRef = [(LLAppDelegate*)[[NSApplication sharedApplication] delegate] window]; [winRef setAcceptsMouseMovedEvents:TRUE]; return winRef; @@ -420,7 +420,7 @@ void makeFirstResponder(NSWindowRef window, GLViewRef view) void requestUserAttention() { - [[LLNSApplication sharedApplication] requestUserAttention:NSInformationalRequest]; + [[NSApplication sharedApplication] requestUserAttention:NSInformationalRequest]; } long showAlert(std::string text, std::string title, int type) @@ -470,7 +470,7 @@ long showAlert(std::string text, std::string title, int type) /* GLViewRef getGLView() { - return [(LLAppDelegate*)[[LLNSApplication sharedApplication] delegate] glview]; + return [(LLAppDelegate*)[[NSApplication sharedApplication] delegate] glview]; } */ diff --git a/indra/newview/ao.cpp b/indra/newview/ao.cpp index e9a0066107..eba236ea90 100644 --- a/indra/newview/ao.cpp +++ b/indra/newview/ao.cpp @@ -85,7 +85,7 @@ void FloaterAO::updateSetParameters() mOverrideSitsCheckBoxSmall->setValue(mSelectedSet->getSitOverride()); mSmartCheckBox->setValue(mSelectedSet->getSmart()); mDisableMouselookCheckBox->setValue(mSelectedSet->getMouselookDisable()); - BOOL isDefault = (mSelectedSet == AOEngine::instance().getDefaultSet()) ? TRUE : FALSE; + BOOL isDefault = (mSelectedSet == AOEngine::instance().getDefaultSet()); mDefaultCheckBox->setValue(isDefault); mDefaultCheckBox->setEnabled(!isDefault); updateSmart(); @@ -221,6 +221,7 @@ BOOL FloaterAO::postBuild() mOverrideSitsCheckBoxSmall = mSmallInterfacePanel->getChild("ao_sit_override_small"); mSetSelector->setCommitCallback(boost::bind(&FloaterAO::onSelectSet, this)); + mSetSelector->setFocusLostCallback(boost::bind(&FloaterAO::onSelectSet, this)); mActivateSetButton->setCommitCallback(boost::bind(&FloaterAO::onClickActivate, this)); mAddButton->setCommitCallback(boost::bind(&FloaterAO::onClickAdd, this)); mRemoveButton->setCommitCallback(boost::bind(&FloaterAO::onClickRemove, this)); @@ -281,7 +282,7 @@ void FloaterAO::enableSetControls(BOOL yes) mSetSelectorSmall->setEnabled(yes); mActivateSetButton->setEnabled(yes); mRemoveButton->setEnabled(yes); - mDefaultCheckBox->setEnabled(yes); + mDefaultCheckBox->setEnabled(yes && (mSelectedSet != AOEngine::instance().getDefaultSet())); mOverrideSitsCheckBox->setEnabled(yes); mOverrideSitsCheckBoxSmall->setEnabled(yes); mDisableMouselookCheckBox->setEnabled(yes); diff --git a/indra/newview/aoengine.cpp b/indra/newview/aoengine.cpp index 8646b4f165..8184e254fe 100644 --- a/indra/newview/aoengine.cpp +++ b/indra/newview/aoengine.cpp @@ -189,34 +189,50 @@ void AOEngine::setLastOverriddenMotion(const LLUUID& motion) } } -BOOL AOEngine::foreignAnimations(const LLUUID& seat) +BOOL AOEngine::foreignAnimations() { + // checking foreign animations only makes sense when smart sit is enabled + if (!mCurrentSet->getSmart()) + { + return FALSE; + } + + // get the seat the avatar is sitting on + const LLViewerObject* agentRoot = dynamic_cast(gAgentAvatarp->getRoot()); + if (!agentRoot) + { + // this should not happen, ever + return FALSE; + } + + LLUUID seat = agentRoot->getID(); + if (seat == gAgentID) + { + LL_DEBUGS("AOEngine") << "Not checking for foreign animation when not sitting." << LL_ENDL; + return FALSE; + } + LL_DEBUGS("AOEngine") << "Checking for foreign animation on seat " << seat << LL_ENDL; for (LLVOAvatar::AnimSourceIterator sourceIterator = gAgentAvatarp->mAnimationSources.begin(); sourceIterator != gAgentAvatarp->mAnimationSources.end(); ++sourceIterator) { - LL_DEBUGS("AOEngine") << "Source " << sourceIterator->first << " runs animation " << sourceIterator->second << LL_ENDL; - + // skip animations run by the avatar itself if (sourceIterator->first != gAgentID) { - // special case when the AO gets disabled while sitting - if (seat.isNull()) - { - return TRUE; - } - // find the source object where the animation came from LLViewerObject* source=gObjectList.findObject(sourceIterator->first); // proceed if it's not an attachment if(!source->isAttachment()) { + LL_DEBUGS("AOEngine") << "Source " << sourceIterator->first << " is running animation " << sourceIterator->second << LL_ENDL; + // get the source's root prim LLViewerObject* sourceRoot=dynamic_cast(source->getRoot()); // if the root prim is the same as the animation source, report back as TRUE - if (sourceRoot && source->getID() == seat) + if (sourceRoot && sourceRoot->getID() == seat) { LL_DEBUGS("AOEngine") << "foreign animation " << sourceIterator->second << " found on seat." << LL_ENDL; return TRUE; @@ -227,7 +243,8 @@ BOOL AOEngine::foreignAnimations(const LLUUID& seat) return FALSE; } -const LLUUID& AOEngine::mapSwimming(const LLUUID& motion) const +// map motion to underwater state, return nullptr if not applicable +AOSet::AOState* AOEngine::mapSwimming(const LLUUID& motion) const { S32 stateNum; @@ -249,29 +266,91 @@ const LLUUID& AOEngine::mapSwimming(const LLUUID& motion) const } else { - return LLUUID::null; + // motion not applicable for underwater mapping + return nullptr; } - AOSet::AOState* state = mCurrentSet->getState(stateNum); - return mCurrentSet->getAnimationForState(state); + return mCurrentSet->getState(stateNum); } +// switch between swimming and flying on transition in and out of Linden region water void AOEngine::checkBelowWater(BOOL yes) { + // there was no transition, do nothing if (mUnderWater == yes) { return; } - // only restart underwater/above water motion if the overridden motion is the one currently playing - if (mLastMotion != mLastOverriddenMotion) + // only applies to motions that actually change underwater and have animations inside + AOSet::AOState* mapped = mapSwimming(mLastMotion); + if (!mapped || mapped->mAnimations.empty()) { + // set underwater status but do nothing else + mUnderWater = yes; return; } - gAgent.sendAnimationRequest(override(mLastOverriddenMotion, FALSE), ANIM_REQUEST_STOP); + // find animation id to stop when transitioning + LLUUID id = override(mLastMotion, FALSE); + if (id.isNull()) + { + // no animation in overrider for this state, use Linden Lab motion + id = mLastMotion; + } + + // stop currently running animation + gAgent.sendAnimationRequest(id, ANIM_REQUEST_STOP); + + if (!mUnderWater) + { + // remember which animation we stopped while going under water, to catch the stop + // request later in the overrider - this prevents the overrider from triggering itself + // after the region comes back with the stop request for Linden Lab motion ids + mTransitionId = id; + } + + // set requested underwater status for overrider mUnderWater = yes; - gAgent.sendAnimationRequest(override(mLastOverriddenMotion, TRUE), ANIM_REQUEST_START); + + // find animation id to start when transitioning + id = override(mLastMotion, TRUE); + if (id.isNull()) + { + // no animation in overrider for this state, use Linden Lab motion + id = mLastMotion; + } + + // start new animation + gAgent.sendAnimationRequest(id, ANIM_REQUEST_START); +} + +// find the correct animation state for the requested motion, mapping flying to +// swimming where necessary +AOSet::AOState* AOEngine::getStateForMotion(const LLUUID& motion) const +{ + // get default state for this motion + AOSet::AOState* defaultState = mCurrentSet->getStateByRemapID(motion); + if (!mUnderWater) + { + return defaultState; + } + + // get state for underwater motion + AOSet::AOState* mapped = mapSwimming(motion); + if (!mapped) + { + // not applicable for underwater motion, so use default state + return defaultState; + } + + // check if the underwater state has any animations to play + if (mapped->mAnimations.empty()) + { + // no animations in underwater state, return default + return defaultState; + } + return mapped; } void AOEngine::enable_stands(BOOL yes) @@ -300,8 +379,8 @@ void AOEngine::enable(BOOL yes) { LL_DEBUGS("AOEngine") << "Enabling animation state " << state->mName << LL_ENDL; - // do not stop underlying ground sit when re-enabling the AO - if (mLastOverriddenMotion != ANIM_AGENT_SIT_GROUND_CONSTRAINED) + // do not stop underlying sit animations when re-enabling the AO + if (mLastOverriddenMotion != ANIM_AGENT_SIT_GROUND_CONSTRAINED && mLastOverriddenMotion != ANIM_AGENT_SIT) { gAgent.sendAnimationRequest(mLastOverriddenMotion, ANIM_REQUEST_STOP); } @@ -357,7 +436,12 @@ void AOEngine::enable(BOOL yes) { mAnimationChangedSignal(LLUUID::null); - gAgent.sendAnimationRequest(ANIM_AGENT_SIT_GENERIC, ANIM_REQUEST_STOP); + if (mLastOverriddenMotion == ANIM_AGENT_SIT) + { + // remove sit cycle cover up + gAgent.sendAnimationRequest(ANIM_AGENT_SIT_GENERIC, ANIM_REQUEST_STOP); + } + // stop all overriders, catch leftovers for (S32 index = 0; index < AOSet::AOSTATES_MAX; ++index) { @@ -379,7 +463,8 @@ void AOEngine::enable(BOOL yes) } } - if (!foreignAnimations(LLUUID::null)) + // restore Linden animation if applicable + if (mLastOverriddenMotion != ANIM_AGENT_SIT || !foreignAnimations()) { gAgent.sendAnimationRequest(mLastMotion, ANIM_REQUEST_START); } @@ -443,7 +528,9 @@ const LLUUID AOEngine::override(const LLUUID& pMotion, BOOL start) motion = ANIM_AGENT_SIT_GROUND_CONSTRAINED; } - AOSet::AOState* state = mCurrentSet->getStateByRemapID(motion); + // map the requested motion to an animation state, taking underwater + // swimming into account where applicable + AOSet::AOState* state = getStateForMotion(motion); if (!state) { LL_DEBUGS("AOEngine") << "No current AO state for motion " << motion << " (" << gAnimLibrary.animationName(motion) << ")." << LL_ENDL; @@ -470,6 +557,63 @@ const LLUUID AOEngine::override(const LLUUID& pMotion, BOOL start) mAnimationChangedSignal(LLUUID::null); + // clean up stray animations as an additional safety measure + // unless current motion is ANIM_AGENT_TYPE, which is a special + // case, as it plays at the same time as other motions + if (motion != ANIM_AGENT_TYPE) + { + const S32 cleanupStates[]= + { + AOSet::Standing, + AOSet::Walking, + AOSet::Running, + AOSet::Sitting, + AOSet::SittingOnGround, + AOSet::Crouching, + AOSet::CrouchWalking, + AOSet::Falling, + AOSet::FlyingDown, + AOSet::FlyingUp, + AOSet::Flying, + AOSet::FlyingSlow, + AOSet::Hovering, + AOSet::Jumping, + AOSet::TurningRight, + AOSet::TurningLeft, + AOSet::Floating, + AOSet::SwimmingForward, + AOSet::SwimmingUp, + AOSet::SwimmingDown, + AOSet::AOSTATES_MAX // end marker, guaranteed to be different from any other entry + }; + + S32 index = 0; + S32 stateNum; + + // loop through the list of states + while ((stateNum = cleanupStates[index]) != AOSet::AOSTATES_MAX) + { + // check if the next state is the one we are currently animating and skip that + AOSet::AOState* stateToCheck = mCurrentSet->getState(stateNum); + if (stateToCheck != state) + { + // check if there is an animation left over for that state + if (!stateToCheck->mCurrentAnimationID.isNull()) + { + LL_WARNS() << "cleaning up animation in state " << stateToCheck->mName << LL_ENDL; + + // stop the leftover animation locally and in the region for everyone + gAgent.sendAnimationRequest(stateToCheck->mCurrentAnimationID, ANIM_REQUEST_STOP); + gAgentAvatarp->LLCharacter::stopMotion(stateToCheck->mCurrentAnimationID); + + // mark the state as clean + stateToCheck->mCurrentAnimationID.setNull(); + } + } + index++; + } + } + mCurrentSet->stopTimer(); if (start) { @@ -523,12 +667,6 @@ const LLUUID AOEngine::override(const LLUUID& pMotion, BOOL start) mCurrentSet->setMotion(motion); } - mUnderWater = gAgentAvatarp->mBelowWater; - if (mUnderWater) - { - animation = mapSwimming(motion); - } - if (animation.isNull()) { animation = mCurrentSet->getAnimationForState(state); @@ -580,6 +718,20 @@ const LLUUID AOEngine::override(const LLUUID& pMotion, BOOL start) } else { + // check for previously remembered transition motion from/to underwater movement and don't + // allow the overrider to stop it, or it will cancel the transition to underwater motion + // immediately after starting it + if (motion == mTransitionId) + { + // clear transition motion id and return a null UUID to allow the stock Linden animation + // system to take over + mTransitionId.setNull(); + return LLUUID::null; + } + + // clear transition motion id here as well, to make sure there is no stray id left behind + mTransitionId.setNull(); + animation = state->mCurrentAnimationID; state->mCurrentAnimationID.setNull(); @@ -629,15 +781,7 @@ const LLUUID AOEngine::override(const LLUUID& pMotion, BOOL start) void AOEngine::checkSitCancel() { - LLUUID seat; - - const LLViewerObject* agentRoot = dynamic_cast(gAgentAvatarp->getRoot()); - if (agentRoot) - { - seat = agentRoot->getID(); - } - - if (foreignAnimations(seat)) + if (foreignAnimations()) { AOSet::AOState* aoState = mCurrentSet->getStateByRemapID(ANIM_AGENT_SIT); if (aoState) @@ -676,40 +820,29 @@ void AOEngine::cycleTimeout(const AOSet* set) void AOEngine::cycle(eCycleMode cycleMode) { + if (!mEnabled) + { + return; + } + if (!mCurrentSet) { LL_DEBUGS("AOEngine") << "cycle without set." << LL_ENDL; return; } - LLUUID motion = mCurrentSet->getMotion(); - - // assume stand if no motion is registered, happens after login when the avatar hasn't moved at all yet - // or if the agent has said something in local chat while sitting - if (motion.isNull()) - { - if (gAgentAvatarp->isSitting()) - { - motion = ANIM_AGENT_SIT; - } - else - { - motion = ANIM_AGENT_STAND; - } - } - // do not cycle if we're sitting and sit-override is off - else if (motion == ANIM_AGENT_SIT && !mCurrentSet->getSitOverride()) + if (mLastMotion == ANIM_AGENT_SIT && !mCurrentSet->getSitOverride()) { return; } // do not cycle if we're standing and mouselook stand override is disabled while being in mouselook - else if (motion == ANIM_AGENT_STAND && mCurrentSet->getMouselookDisable() && mInMouselook) + else if (mLastMotion == ANIM_AGENT_STAND && mCurrentSet->getMouselookDisable() && mInMouselook) { return; } - AOSet::AOState* state = mCurrentSet->getStateByRemapID(motion); + AOSet::AOState* state = mCurrentSet->getStateByRemapID(mLastMotion); if (!state) { LL_DEBUGS("AOEngine") << "cycle without state." << LL_ENDL; @@ -771,13 +904,13 @@ void AOEngine::cycle(eCycleMode cycleMode) state->mCurrentAnimationID = animation; if (animation.notNull()) { - LL_DEBUGS("AOEngine") << "requesting animation start for motion " << gAnimLibrary.animationName(motion) << ": " << animation << LL_ENDL; + LL_DEBUGS("AOEngine") << "requesting animation start for motion " << gAnimLibrary.animationName(mLastMotion) << ": " << animation << LL_ENDL; gAgent.sendAnimationRequest(animation, ANIM_REQUEST_START); mAnimationChangedSignal(state->mAnimations[state->mCurrentAnimation].mInventoryUUID); } else { - LL_DEBUGS("AOEngine") << "overrider came back with NULL animation for motion " << gAnimLibrary.animationName(motion) << "." << LL_ENDL; + LL_DEBUGS("AOEngine") << "overrider came back with NULL animation for motion " << gAnimLibrary.animationName(mLastMotion) << "." << LL_ENDL; } if (oldAnimation.notNull()) @@ -1617,28 +1750,36 @@ void AOEngine::setOverrideSits(AOSet* set, BOOL yes) return; } + if (!mEnabled) + { + return; + } + if (yes) { stopAllSitVariants(); - gAgent.sendAnimationRequest(override(ANIM_AGENT_SIT, TRUE), ANIM_REQUEST_START); + gAgent.sendAnimationRequest(ANIM_AGENT_SIT_GENERIC, ANIM_REQUEST_START); } else { + // remove sit cycle cover up + gAgent.sendAnimationRequest(ANIM_AGENT_SIT_GENERIC, ANIM_REQUEST_STOP); + AOSet::AOState* state = mCurrentSet->getState(AOSet::Sitting); - if (!state) + if (state) { - return; + LLUUID animation = state->mCurrentAnimationID; + if (animation.notNull()) + { + gAgent.sendAnimationRequest(animation, ANIM_REQUEST_STOP); + state->mCurrentAnimationID.setNull(); + } } - LLUUID animation = state->mCurrentAnimationID; - if (animation.notNull()) + if (!foreignAnimations()) { - gAgent.sendAnimationRequest(animation, ANIM_REQUEST_STOP); - gAgentAvatarp->LLCharacter::stopMotion(animation); - state->mCurrentAnimationID.setNull(); + gAgent.sendAnimationRequest(ANIM_AGENT_SIT, ANIM_REQUEST_START); } - - gAgent.sendAnimationRequest(ANIM_AGENT_SIT, ANIM_REQUEST_START); } } @@ -1647,6 +1788,11 @@ void AOEngine::setSmart(AOSet* set, BOOL yes) set->setSmart(yes); set->setDirty(TRUE); + if (!mEnabled) + { + return; + } + if (yes) { // make sure to restart the sit cancel timer to fix sit overrides when the object we are @@ -1669,6 +1815,11 @@ void AOEngine::setDisableStands(AOSet* set, BOOL yes) return; } + if (!mEnabled) + { + return; + } + // make sure an update happens if needed mInMouselook = !gAgentCamera.cameraMouselook(); inMouselook(!mInMouselook); @@ -2060,7 +2211,7 @@ void AOEngine::onRegionChange() } // sitting needs special attention - if (mCurrentSet->getMotion() == ANIM_AGENT_SIT) + if (mLastMotion == ANIM_AGENT_SIT) { // do nothing if sit overrides was disabled if (!mCurrentSet->getSitOverride()) @@ -2076,9 +2227,15 @@ void AOEngine::onRegionChange() return; } - // do nothing if smart sit is enabled because we have no - // animation running from the AO - if (mCurrentSet->getSmart()) + AOSet::AOState* state = mCurrentSet->getState(AOSet::Sitting); + if (!state) + { + return; + } + + // do nothing if no AO animation is playing (e.g. smart sit cancel) + LLUUID animation = state->mCurrentAnimationID; + if (animation.isNull()) { return; } diff --git a/indra/newview/aoengine.h b/indra/newview/aoengine.h index b92490bd08..50f55519b5 100644 --- a/indra/newview/aoengine.h +++ b/indra/newview/aoengine.h @@ -171,8 +171,9 @@ class AOEngine void stopAllStandVariants(); void stopAllSitVariants(); - BOOL foreignAnimations(const LLUUID& seat); - const LLUUID& mapSwimming(const LLUUID& motion) const; + BOOL foreignAnimations(); + AOSet::AOState* mapSwimming(const LLUUID& motion) const; + AOSet::AOState* getStateForMotion(const LLUUID& motion) const; void updateSortOrder(AOSet::AOState* state); void saveSet(const AOSet* set); @@ -204,6 +205,7 @@ class AOEngine LLUUID mAOFolder; LLUUID mLastMotion; LLUUID mLastOverriddenMotion; + LLUUID mTransitionId; std::vector mSets; std::vector mOldSets; diff --git a/indra/newview/llappdelegate-objc.mm b/indra/newview/llappdelegate-objc.mm index 2b3efec77b..69cc5811aa 100644 --- a/indra/newview/llappdelegate-objc.mm +++ b/indra/newview/llappdelegate-objc.mm @@ -151,7 +151,7 @@ // Once pumpMainLoop() reports that we're done, cancel frameTimer: // stop the repetitive calls. [frameTimer release]; - [[LLNSApplication sharedApplication] terminate:self]; + [[LLApplication sharedApplication] terminate:self]; } } diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index d3bcc95f89..945b80ee3e 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -806,6 +806,11 @@ BOOL LLFloaterPreference::postBuild() onPieColorsOverrideChanged(); // Pie menu + // Group Notices and chiclets location setting conversion BOOL => S32 + gSavedSettings.getControl("ShowGroupNoticesTopRight")->getSignal()->connect(boost::bind(&LLFloaterPreference::onShowGroupNoticesTopRightChanged, this)); + onShowGroupNoticesTopRightChanged(); + // Group Notices and chiclets location setting conversion BOOL => S32 + // Show email address in preferences (FIRE-1071) getChild("send_im_to_email")->setLabelArg("[EMAIL]", getString("LoginToChange")); @@ -869,6 +874,13 @@ void LLFloaterPreference::onPieColorsOverrideChanged() } // Pie menu +// Group Notices and chiclets location setting conversion BOOL => S32 +void LLFloaterPreference::onShowGroupNoticesTopRightChanged() +{ + getChild("ShowGroupNoticesTopRight")->setValue(gSavedSettings.getBOOL("ShowGroupNoticesTopRight")); +} +// Group Notices and chiclets location setting conversion BOOL => S32 + void LLFloaterPreference::updateDeleteTranscriptsButton() { // LLLogChat::getListOfTranscriptFiles will go through the whole chatlog dir, reach a bit of each file, diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 9762d1de02..e69d6e3ed9 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -164,6 +164,9 @@ protected: // Correct enabled state of Animated Script Dialogs option void updateAnimatedScriptDialogs(); + // Group Notices and chiclets location setting conversion BOOL => S32 + void onShowGroupNoticesTopRightChanged(); + public: // This function squirrels away the current values of the controls so that // cancel() can restore them. diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 78acc61b19..8b0a02051c 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -3698,14 +3698,25 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) { std::string complexity_string; LLLocale locale(""); - LLResMgr::getInstance()->getIntegerString(complexity_string, complexity); + // always show complexity, even if the reason for a jelly baby is the texture area + // this is technically not 100% correct but the decision logic with all of the + // exceptions would be way too complex to justify the result - Zi + LLResMgr::getInstance()->getIntegerString(complexity_string, complexity); LLStringUtil::format_map_t label_args; label_args["COMPLEXITY"] = complexity_string; + addNameTagLine(format_string(complexity_label, label_args), complexity_color, LLFontGL::NORMAL, LLFontGL::getFontSansSerifSmall()); + + // only show texture area if this is the reason for jelly baby rendering static LLCachedControl max_attachment_area(gSavedSettings, "RenderAutoMuteSurfaceAreaLimit", 1000.0f); - bool surface_limit_exceeded = max_attachment_area > 0.f && mAttachmentSurfaceArea > max_attachment_area; - addNameTagLine(format_string(complexity_label, label_args) + (surface_limit_exceeded ? " \xE2\x96\xA0" : ""), complexity_color, LLFontGL::NORMAL, LLFontGL::getFontSansSerifSmall()); + if (max_attachment_area > 0.f && mAttachmentSurfaceArea > max_attachment_area) + { + LLResMgr::getInstance()->getIntegerString(complexity_string, mAttachmentSurfaceArea); + label_args["TEXTURE_AREA"] = complexity_string; + + addNameTagLine(format_string(complexity_label, label_args), LLColor4::red, LLFontGL::NORMAL, LLFontGL::getFontSansSerifSmall()); + } } // diff --git a/indra/newview/skins/default/xui/de/panel_preferences_UI.xml b/indra/newview/skins/default/xui/de/panel_preferences_UI.xml index 5fd1798918..1794b51ae5 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_UI.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_UI.xml @@ -63,7 +63,13 @@ - + + Position Gruppenmitt. und Chiclets: + + + + + (Erfordert Neustart) diff --git a/indra/newview/skins/default/xui/de/panel_preferences_colors.xml b/indra/newview/skins/default/xui/de/panel_preferences_colors.xml index 72d681b34f..38e97fcd4f 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_colors.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_colors.xml @@ -143,10 +143,15 @@ - - - Auswahl-Radius: + + + Selektionsradius-Farbe: + + + Deckkraft: + + Punkte auf Minikarte: diff --git a/indra/newview/skins/default/xui/de/panel_preferences_move.xml b/indra/newview/skins/default/xui/de/panel_preferences_move.xml index c1ba2810e5..98a48ad121 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_move.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_move.xml @@ -114,7 +114,7 @@ - + Weltkarte-Optionen: diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index a31a083290..509e2d85be 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -6966,6 +6966,9 @@ Ihre aktuelle Position: [AVATAR_POS] Komplexität: [COMPLEXITY] + + Textur-Oberfläche: [TEXTURE_AREA] m² + Unbekannte Schriftart diff --git a/indra/newview/skins/default/xui/en/floater_fast_timers.xml b/indra/newview/skins/default/xui/en/floater_fast_timers.xml index 645003cc14..341230c606 100644 --- a/indra/newview/skins/default/xui/en/floater_fast_timers.xml +++ b/indra/newview/skins/default/xui/en/floater_fast_timers.xml @@ -73,7 +73,9 @@ name="scroll_vert" orientation="vertical" step_size="16" + doc_pos="0" doc_size="3000" + page_size="0" /> - + Group Notices and chiclets location: + + + - + + + + - (requires restart) + top_pad="-14" + type="string" + width="128"> + (requires restart) + - Pick radius: + Pick radius color: + + Opacity: + + tool_tip="Controls the opacity of the pick range on the minimap. The size of the pick range can be adjusted with the Pick radius setting." + width="173" /> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index e0b10fe522..86e662be6a 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -3124,6 +3124,7 @@ Your current position: [AVATAR_POS] Fully Complexity: [COMPLEXITY] + Texture Area: [TEXTURE_AREA] m² Unknown Font Deja Vu diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml index b44eb888de..ead3a4faf8 100644 --- a/indra/newview/skins/default/xui/pl/notifications.xml +++ b/indra/newview/skins/default/xui/pl/notifications.xml @@ -81,6 +81,9 @@ Inicjalizacja Marketplace nieudana z powodu błędu sieci lub systemu. Spróbuj '[ERROR_CODE]' + + Jeden lub więcej przedmiotów nie może być użyty w "Strojach" + Kopiowanie lub przenoszenie przedmiotów na Marketplace nie powiodło się: @@ -608,9 +611,6 @@ Obiekt może znajdować się zbyt daleko albo został usunięty. Odwiedzić [_URL], aby uzyskać więcej informacji? - - Proszę nie uruchamiać przeglądarki bezpośrednio. Zamiast tego zaktualizuj wszystkie skróty, aby wskazywały na program rozruchowy. - Prawdopodobnie istnieje nowszy sterownik dla Twojej karty graficznej. Aktualizacja sterowników graficznych może znacznie zwiększyć wydajność. diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_UI.xml b/indra/newview/skins/default/xui/pl/panel_preferences_UI.xml index bbfd2221f6..e48993ac18 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_UI.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_UI.xml @@ -59,7 +59,13 @@ - + + Pozycja ogłoszeń grup oraz ikonek: + + + + + (wymaga restartu) diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_colors.xml b/indra/newview/skins/default/xui/pl/panel_preferences_colors.xml index 55cee49580..be627c1f31 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_colors.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_colors.xml @@ -141,9 +141,14 @@ - - Okrąg zazn.: + + Okrąg zaznaczenia: + + + Przezr.: + + Kropki minimapy: diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_move.xml b/indra/newview/skins/default/xui/pl/panel_preferences_move.xml index b97c92e139..85169111f0 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_move.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_move.xml @@ -105,7 +105,7 @@ - + Opcje mapy świata: diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml index ee1702c825..d6087e2f27 100644 --- a/indra/newview/skins/default/xui/pl/strings.xml +++ b/indra/newview/skins/default/xui/pl/strings.xml @@ -601,6 +601,12 @@ Spróbuj zalogować się ponownie za minutę. Wszystkie rzeczy w folderze Magazynowym muszą mieć ten sam typ i zezwolenia + + W "Strojach" możesz umieszczać tylko przedmioty lub stroje z własnej Szafy + + + Jeden lub więcej przedmiotów nie może być użyty w "Strojach" + Nie możesz przenieść folderu do jego obiektu podrzędnego @@ -6281,6 +6287,9 @@ Twoja aktualna pozycja: [AVATAR_POS] Złożoność: [COMPLEXITY] + + Tekstury: [TEXTURE_AREA] m² + Nieznana czcionka diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 7f32647a1b..e2aa3933bc 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -1782,7 +1782,8 @@ class DarwinManifest(ViewerManifest): print "Converting temp disk image to final disk image" self.run_command(['hdiutil', 'convert', sparsename, '-format', 'UDZO', '-imagekey', 'zlib-level=9', '-o', finalname]) - self.run_command(['hdiutil', 'internet-enable', '-yes', finalname]) + # This command no longer exists as of OS X Catalina + #self.run_command(['hdiutil', 'internet-enable', '-yes', finalname]) # get rid of the temp file self.package_file = finalname self.remove(sparsename)