diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 532007e8bc5..7d6c937b857 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -253,32 +253,6 @@ const std::string& LLView::getName() const return mName.empty() ? no_name : mName; } -void LLView::setName(const std::string& name) -{ - if (name == mName) - { - return; - } - - LLView* parent = mParentView; - - if (parent && !mName.empty()) - { - auto it = parent->mChildNameCache.find(mName); - if (it != parent->mChildNameCache.end() && it->second == this) - { - parent->mChildNameCache.erase(it); - } - } - - mName = name; - - if (parent && !mName.empty()) - { - parent->mChildNameCache[mName] = this; - } -} - void LLView::sendChildToFront(LLView* child) { // llassert_always(sDepth == 0); // Avoid re-ordering while drawing; it can cause subtle iterator bugs @@ -331,12 +305,6 @@ bool LLView::addChild(LLView* child, S32 tab_group) // add to front of child list, as normal mChildList.push_front(child); - // Add to name cache for fast lookup - if (child->hasName()) - { - mChildNameCache[child->getName()] = child; - } - // add to tab order list if (tab_group != 0) { @@ -376,17 +344,6 @@ void LLView::removeChild(LLView* child) // if we are removing an item we are currently iterating over, that would be bad llassert(!child->mInDraw); mChildList.remove( child ); - - // Remove from name cache - verify pointer to handle duplicate names - if (child->hasName()) - { - auto it = mChildNameCache.find(child->getName()); - if (it != mChildNameCache.end() && it->second == child) - { - mChildNameCache.erase(it); - } - } - child->mParentView = NULL; child_tab_order_t::iterator found = mTabOrder.find(child); if (found != mTabOrder.end()) @@ -1692,40 +1649,15 @@ LLView* LLView::findChildView(std::string_view name, bool recurse) const { LL_PROFILE_ZONE_SCOPED_CATEGORY_UI; - // Check cache first for direct children - O(1) lookup instead of O(n) - if (!mChildNameCache.empty()) - { - std::string lookup_key(name); - auto cache_it = mChildNameCache.find(lookup_key); - if (cache_it != mChildNameCache.end()) - { - return cache_it->second; - } - } - // Look for direct children *first* for (LLView* childp : mChildList) { llassert(childp); - const std::string& child_name = childp->getName(); - - if (child_name.empty()) + if (childp->getName() == name) { - if (name.empty()) - { - return childp; - } - continue; - } - - if (child_name == name) - { - // Cache the result for next lookup - mChildNameCache[child_name] = childp; return childp; } } - if (recurse) { // Look inside each child as well. diff --git a/indra/llui/llview.h b/indra/llui/llview.h index 4a9432d12b4..d747ef95551 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -50,7 +50,6 @@ #include #include -#include class LLSD; @@ -237,8 +236,7 @@ class LLView void setFollowsAll() { mReshapeFlags |= FOLLOWS_ALL; } void setSoundFlags(U8 flags) { mSoundFlags = flags; } - void setName(const std::string& name); - bool hasName() const { return !mName.empty(); } + void setName(std::string name) { mName = name; } void setUseBoundingRect( bool use_bounding_rect ); bool getUseBoundingRect() const; @@ -590,9 +588,6 @@ class LLView LLView* mParentView; child_list_t mChildList; - // Cache for fast child lookup by name - O(1) instead of O(n) - mutable std::unordered_map mChildNameCache; - // location in pixels, relative to surrounding structure, bottom,left=0,0 bool mVisible; LLRect mRect; diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp index 34643d5f5c1..5a37167f181 100644 --- a/indra/llxml/llcontrol.cpp +++ b/indra/llxml/llcontrol.cpp @@ -37,6 +37,7 @@ #include "llstring.h" #include "v3math.h" #include "v3dmath.h" +#include "v4math.h" #include "v4coloru.h" #include "v4color.h" #include "v3color.h" @@ -63,6 +64,7 @@ template <> eControlType get_control_type(); template <> eControlType get_control_type(); template <> eControlType get_control_type(); +template <> eControlType get_control_type(); template <> eControlType get_control_type(); template <> eControlType get_control_type(); template <> eControlType get_control_type(); @@ -72,6 +74,7 @@ template <> eControlType get_control_type(); template <> LLSD convert_to_llsd(const U32& in); template <> LLSD convert_to_llsd(const LLVector3& in); template <> LLSD convert_to_llsd(const LLVector3d& in); +template <> LLSD convert_to_llsd(const LLVector4& in); template <> LLSD convert_to_llsd(const LLRect& in); template <> LLSD convert_to_llsd(const LLColor4& in); template <> LLSD convert_to_llsd(const LLColor3& in); @@ -85,6 +88,7 @@ template <> std::string convert_from_llsd(const LLSD& sd, eControlT template <> LLWString convert_from_llsd(const LLSD& sd, eControlType type, std::string_view control_name); template <> LLVector3 convert_from_llsd(const LLSD& sd, eControlType type, std::string_view control_name); template <> LLVector3d convert_from_llsd(const LLSD& sd, eControlType type, std::string_view control_name); +template <> LLVector4 convert_from_llsd(const LLSD& sd, eControlType type, std::string_view control_name); template <> LLRect convert_from_llsd(const LLSD& sd, eControlType type, std::string_view control_name); template <> LLColor4 convert_from_llsd(const LLSD& sd, eControlType type, std::string_view control_name); template <> LLColor4U convert_from_llsd(const LLSD& sd, eControlType type, std::string_view control_name); @@ -124,6 +128,9 @@ bool LLControlVariable::llsd_compare(const LLSD& a, const LLSD & b) case TYPE_VEC3D: result = LLVector3d(a) == LLVector3d(b); break; + case TYPE_VEC4: + result = LLVector4(a) == LLVector4(b); + break; case TYPE_QUAT: result = LLQuaternion(a) == LLQuaternion(b); break; @@ -373,6 +380,7 @@ const std::string LLControlGroup::mTypeString[TYPE_COUNT] = { "U32" ,"Rect" ,"Color4" ,"Color3" + ,"Vector4" ,"LLSD" }; @@ -532,6 +540,11 @@ LLControlVariable* LLControlGroup::declareVec3d(const std::string& name, const L return declareControl(name, TYPE_VEC3D, initial_val.getValue(), comment, persist); } +LLControlVariable* LLControlGroup::declareVec4(const std::string& name, const LLVector4 &initial_val, const std::string& comment, LLControlVariable::ePersist persist) +{ + return declareControl(name, TYPE_VEC4, initial_val.getValue(), comment, persist); +} + LLControlVariable* LLControlGroup::declareQuat(const std::string& name, const LLQuaternion &initial_val, const std::string& comment, LLControlVariable::ePersist persist) { return declareControl(name, TYPE_QUAT, initial_val.getValue(), comment, persist); @@ -614,6 +627,11 @@ LLVector3d LLControlGroup::getVector3d(std::string_view name) return get(name); } +LLVector4 LLControlGroup::getVector4(std::string_view name) +{ + return get(name); +} + LLQuaternion LLControlGroup::getQuaternion(std::string_view name) { return get(name); @@ -714,6 +732,11 @@ void LLControlGroup::setVector3d(std::string_view name, const LLVector3d &val) set(name, val); } +void LLControlGroup::setVector4(std::string_view name, const LLVector4 &val) +{ + set(name, val); +} + void LLControlGroup::setQuaternion(std::string_view name, const LLQuaternion &val) { set(name, val); @@ -1262,6 +1285,11 @@ template <> eControlType get_control_type() return TYPE_VEC3D; } +template <> eControlType get_control_type() +{ + return TYPE_VEC4; +} + template <> eControlType get_control_type() { return TYPE_QUAT; @@ -1302,6 +1330,11 @@ template <> LLSD convert_to_llsd(const LLVector3d& in) { return in.getValue(); } +template <> LLSD convert_to_llsd(const LLVector4& in) +{ + return in.getValue(); +} + template <> LLSD convert_to_llsd(const LLQuaternion& in) { return in.getValue(); @@ -1418,6 +1451,18 @@ LLVector3d convert_from_llsd(const LLSD& sd, eControlType type, std: } } +template<> +LLVector4 convert_from_llsd(const LLSD& sd, eControlType type, std::string_view control_name) +{ + if (type == TYPE_VEC4) + return LLVector4(sd); + else + { + CONTROL_ERRS << "Invalid LLVector4 value for " << control_name << ": " << LLControlGroup::typeEnumToString(type) << " " << sd << LL_ENDL; + return LLVector4(); + } +} + template<> LLQuaternion convert_from_llsd(const LLSD& sd, eControlType type, std::string_view control_name) { diff --git a/indra/llxml/llcontrol.h b/indra/llxml/llcontrol.h index 5aa2b9715ed..c2bcd20c85f 100644 --- a/indra/llxml/llcontrol.h +++ b/indra/llxml/llcontrol.h @@ -43,6 +43,7 @@ class LLVector3; class LLVector3d; +class LLVector4; class LLQuaternion; class LLColor4; class LLColor3; @@ -61,6 +62,7 @@ typedef enum e_control_type TYPE_RECT, TYPE_COL4, TYPE_COL3, + TYPE_VEC4, TYPE_LLSD, TYPE_COUNT } eControlType; @@ -196,6 +198,7 @@ class LLControlGroup : public LLInstanceTracker LLControlVariable* declareString(const std::string& name, const std::string &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT); LLControlVariable* declareVec3(const std::string& name, const LLVector3 &initial_val,const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT); LLControlVariable* declareVec3d(const std::string& name, const LLVector3d &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT); + LLControlVariable* declareVec4(const std::string& name, const LLVector4 &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT); LLControlVariable* declareQuat(const std::string& name, const LLQuaternion &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT); LLControlVariable* declareRect(const std::string& name, const LLRect &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT); LLControlVariable* declareColor4(const std::string& name, const LLColor4 &initial_val, const std::string& comment, LLControlVariable::ePersist persist = LLControlVariable::PERSIST_NONDFT); @@ -212,6 +215,7 @@ class LLControlGroup : public LLInstanceTracker LLWString getWString(std::string_view name); LLVector3 getVector3(std::string_view name); LLVector3d getVector3d(std::string_view name); + LLVector4 getVector4(std::string_view name); LLRect getRect(std::string_view name); LLSD getLLSD(std::string_view name); LLQuaternion getQuaternion(std::string_view name); @@ -250,6 +254,7 @@ class LLControlGroup : public LLInstanceTracker void setString(std::string_view name, const std::string& val); void setVector3(std::string_view name, const LLVector3 &val); void setVector3d(std::string_view name, const LLVector3d &val); + void setVector4(std::string_view name, const LLVector4 &val); void setQuaternion(std::string_view name, const LLQuaternion &val); void setRect(std::string_view name, const LLRect &val); void setColor4(std::string_view name, const LLColor4 &val); @@ -416,6 +421,7 @@ template <> eControlType get_control_type(); template <> eControlType get_control_type(); template <> eControlType get_control_type(); template <> eControlType get_control_type(); +template <> eControlType get_control_type(); template <> eControlType get_control_type(); template <> eControlType get_control_type(); template <> eControlType get_control_type(); @@ -425,6 +431,7 @@ template <> eControlType get_control_type(); template <> LLSD convert_to_llsd(const U32& in); template <> LLSD convert_to_llsd(const LLVector3& in); template <> LLSD convert_to_llsd(const LLVector3d& in); +template <> LLSD convert_to_llsd(const LLVector4& in); template <> LLSD convert_to_llsd(const LLQuaternion& in); template <> LLSD convert_to_llsd(const LLRect& in); template <> LLSD convert_to_llsd(const LLColor4& in); @@ -434,6 +441,7 @@ template<> std::string convert_from_llsd(const LLSD& sd, eControlTy template<> LLWString convert_from_llsd(const LLSD& sd, eControlType type, std::string_view control_name); template<> LLVector3 convert_from_llsd(const LLSD& sd, eControlType type, std::string_view control_name); template<> LLVector3d convert_from_llsd(const LLSD& sd, eControlType type, std::string_view control_name); +template<> LLVector4 convert_from_llsd(const LLSD& sd, eControlType type, std::string_view control_name); template<> LLQuaternion convert_from_llsd(const LLSD& sd, eControlType type, std::string_view control_name); template<> LLRect convert_from_llsd(const LLSD& sd, eControlType type, std::string_view control_name); template<> bool convert_from_llsd(const LLSD& sd, eControlType type, std::string_view control_name); diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index c695bcf3c51..57e864ef3fe 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -11871,6 +11871,22 @@ Value 20.0 + TextureChannelPriority + + Comment + Per-channel texture streaming aggressiveness. X=normals, Y=diffuse, Z=specular/metallic, W=emissive. 1.0=baseline, higher=more aggressive downrez. + Persist + 1 + Type + Vector4 + Value + + 5 + 7.5 + 20 + 7.5 + + TextureCameraBoost Comment diff --git a/indra/newview/llfloatersettingsdebug.cpp b/indra/newview/llfloatersettingsdebug.cpp index 01108b5cfab..92b3c92165a 100644 --- a/indra/newview/llfloatersettingsdebug.cpp +++ b/indra/newview/llfloatersettingsdebug.cpp @@ -106,6 +106,7 @@ void LLFloaterSettingsDebug::onCommitSettings() LLVector3 vector; LLVector3d vectord; + LLVector4 vector4; LLQuaternion quat; LLRect rect; LLColor4 col4; @@ -142,6 +143,13 @@ void LLFloaterSettingsDebug::onCommitSettings() vectord.mdV[VZ] = mValSpinner3->getValue().asReal(); controlp->set(vectord.getValue()); break; + case TYPE_VEC4: + vector4.mV[VX] = (F32)mValSpinner1->getValue().asReal(); + vector4.mV[VY] = (F32)mValSpinner2->getValue().asReal(); + vector4.mV[VZ] = (F32)mValSpinner3->getValue().asReal(); + vector4.mV[VW] = (F32)mValSpinner4->getValue().asReal(); + controlp->set(vector4.getValue()); + break; case TYPE_QUAT: quat.mQ[VX] = mValSpinner1->getValueF32(); quat.mQ[VY] = mValSpinner2->getValueF32(); @@ -352,6 +360,40 @@ void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp) } break; } + case TYPE_VEC4: + { + LLVector4 v; + v.setValue(sd); + mValSpinner1->setVisible(true); + mValSpinner1->setLabel(std::string("X")); + mValSpinner2->setVisible(true); + mValSpinner2->setLabel(std::string("Y")); + mValSpinner3->setVisible(true); + mValSpinner3->setLabel(std::string("Z")); + mValSpinner4->setVisible(true); + mValSpinner4->setLabel(std::string("W")); + if (!mValSpinner1->hasFocus()) + { + mValSpinner1->setPrecision(3); + mValSpinner1->setValue(v[VX]); + } + if (!mValSpinner2->hasFocus()) + { + mValSpinner2->setPrecision(3); + mValSpinner2->setValue(v[VY]); + } + if (!mValSpinner3->hasFocus()) + { + mValSpinner3->setPrecision(3); + mValSpinner3->setValue(v[VZ]); + } + if (!mValSpinner4->hasFocus()) + { + mValSpinner4->setPrecision(3); + mValSpinner4->setValue(v[VW]); + } + break; + } case TYPE_QUAT: { LLQuaternion q; diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index e4fd9478921..7dd32074cfe 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -1014,6 +1014,38 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag } imagep->addTextureStats(max_vsize); + + // Derive stream priority channel from face lists. + // Map render texture channels to priority channels: + // 0 = normal, 1 = diffuse, 2 = specular, 3 = emissive + { + static const S32 render_to_priority[] = { + 1, // DIFFUSE_MAP (0) + 0, // NORMAL_MAP / ALTERNATE_DIFFUSE_MAP (1) + 2, // SPECULAR_MAP (2) + 1, // BASECOLOR_MAP (3) + 2, // METALLIC_ROUGHNESS_MAP (4) + 0, // GLTF_NORMAL_MAP (5) + 3, // EMISSIVE_MAP (6) + }; + + S32 priority_channel = 1; // default to diffuse + for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i) + { + if (imagep->getNumFaces(i) > 0) + { + priority_channel = llmin(priority_channel, render_to_priority[i]); + } + } + + static LLCachedControl channel_priority(gSavedSettings, "TextureChannelPriority", + LLVector4(10.0f, 20.0f, 40.0f, 20.0f)); + F32 factor = llmax(channel_priority().mV[priority_channel], 0.1f); + if (factor != 1.0f) + { + imagep->mMaxVirtualSize /= factor; + } + } } #if 0