Merge branch 'master' of https://github.com/FirestormViewer/phoenix-firestorm into jp-translation

master
logue 2025-04-25 21:44:41 +09:00
commit a173ca1eb5
32 changed files with 117 additions and 319 deletions

View File

@ -140,10 +140,9 @@ public:
LLVector3 mHeadOffset{}; // current head position
LLAvatarJoint* mRoot{ nullptr };
// <FS:ND> This map gets queried a huge amount of time.
//<FS:Ansariel> Joint-lookup improvements
// typedef std::map<std::string, LLJoint*> joint_map_t;
typedef std::unordered_map<U32, LLJoint*> joint_map_t;
// </FS:ND>
typedef std::map<std::string, LLJoint*, std::less<>> joint_map_t;
joint_map_t mJointMap;

View File

@ -77,7 +77,9 @@ LLCharacter::~LLCharacter()
//-----------------------------------------------------------------------------
// getJoint()
//-----------------------------------------------------------------------------
LLJoint *LLCharacter::getJoint( const std::string &name )
//<FS:Ansariel> Joint-lookup improvements
//LLJoint *LLCharacter::getJoint( const std::string &name )
LLJoint* LLCharacter::getJoint(std::string_view name)
{
LLJoint* joint = NULL;
@ -94,14 +96,6 @@ LLJoint *LLCharacter::getJoint( const std::string &name )
return joint;
}
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
// Default fallback is string.
LLJoint *LLCharacter::getJoint( const JointKey &name )
{
return getJoint( name.mName );
}
// </FS:ND>
//-----------------------------------------------------------------------------
// registerMotion()
//-----------------------------------------------------------------------------

View File

@ -76,13 +76,9 @@ public:
// get the specified joint
// default implementation does recursive search,
// subclasses may optimize/cache results.
//<FS:Ansariel> Joint-lookup improvements
// virtual LLJoint *getJoint( const std::string &name );
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
virtual LLJoint *getJoint( const JointKey &name );
// </FS:ND>
LLJoint *getJoint( const std::string &name );
virtual LLJoint* getJoint(std::string_view name);
// get the position of the character
virtual LLVector3 getCharacterPosition() = 0;

View File

@ -34,32 +34,6 @@
#include "llmath.h"
#include <boost/algorithm/string.hpp>
#include "llmutex.h" // <FS:minerjr> [FIRE-35382] Add share_mutex to fix JointKey::construct lockup
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
#include <unordered_map>
std::unordered_map<std::string, U32> mpStringToKeys;
std::shared_mutex mpStringToKeysMutex; // <FS:minerjr> [FIRE-35382] Add share_mutex to fix JointKey::construct lockup
JointKey JointKey::construct(const std::string& aName)
{
{// <FS:minerjr> [FIRE-35382] Add share_mutex to fix JointKey::construct lockup
std::shared_lock lock(mpStringToKeysMutex); // </FS:minerjr> [FIRE-35382] Added a shared lock for reading the mpStringToKeys unordered_map.
if (const auto itr = mpStringToKeys.find(aName); itr != mpStringToKeys.end())
{
return { aName, itr->second };
}
}// <FS:minerjr> [FIRE-35382] Add share_mutex to fix JointKey::construct lockup
{ // Add a unique lock for writing to the mpStringToKeys unordered_map.
std::unique_lock lock(mpStringToKeysMutex);// </FS:minerjr> [FIRE-35382]
U32 size = static_cast<U32>(mpStringToKeys.size()) + 1;
mpStringToKeys.try_emplace(aName, size);
return { aName, size };
} // <FS:minerjr> [FIRE-35382] Add share_mutex to fix JointKey::construct lockup
}
// </FS:ND>
S32 LLJoint::sNumUpdates = 0;
S32 LLJoint::sNumTouches = 0;
@ -268,7 +242,9 @@ LLJoint *LLJoint::getRoot()
//-----------------------------------------------------------------------------
// findJoint()
//-----------------------------------------------------------------------------
LLJoint *LLJoint::findJoint( const std::string &name )
//<FS:Ansariel> Joint-lookup improvements
//LLJoint *LLJoint::findJoint( const std::string &name )
LLJoint *LLJoint::findJoint(std::string_view name)
{
if (name == getName())
return this;

View File

@ -40,31 +40,6 @@
#include "xform.h"
#include "llmatrix4a.h"
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
struct JointKey
{
std::string mName;
U32 mKey;
static JointKey construct(const std::string& aName);
};
inline bool operator==(JointKey const &aLHS, JointKey const &aRHS)
{
return aLHS.mName == aRHS.mName;
}
inline bool operator!=(JointKey const &aLHS, JointKey const &aRHS)
{
return ! (aLHS == aRHS);
}
inline std::ostream& operator<<(std::ostream &aLHS, JointKey const &aRHS)
{
return aLHS << aRHS.mName << " (" << aRHS.mKey << ")";
}
// </FS:ND>
constexpr S32 LL_CHARACTER_MAX_JOINTS_PER_MESH = 15;
// Need to set this to count of animate-able joints,
// currently = #bones + #collision_volumes + #attachments + 2,
@ -247,7 +222,9 @@ public:
LLJoint *getRoot();
// search for child joints by name
LLJoint *findJoint( const std::string &name );
//<FS:Ansariel> Joint-lookup improvements
//LLJoint *findJoint( const std::string &name );
LLJoint* findJoint(std::string_view name);
// add/remove children
void addChild( LLJoint *joint );

View File

@ -1467,10 +1467,7 @@ void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, do
{
name = mJointMap[name];
}
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
// model->mSkinInfo.mJointNames.push_back( name );
model->mSkinInfo.mJointNames.push_back( JointKey::construct( name ) );
// </FS:ND>
model->mSkinInfo.mJointNames.push_back(name);
model->mSkinInfo.mJointNums.push_back(-1);
}
}
@ -1488,10 +1485,7 @@ void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, do
{
name = mJointMap[name];
}
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
// model->mSkinInfo.mJointNames.push_back( name );
model->mSkinInfo.mJointNames.push_back( JointKey::construct( name ) );
// </FS:ND>
model->mSkinInfo.mJointNames.push_back(name);
model->mSkinInfo.mJointNums.push_back(-1);
}
}
@ -1533,10 +1527,7 @@ void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, do
//but does not use the skeleton).
buildJointToNodeMappingFromScene( root );
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
// critiqueRigForUploadApplicability( model->mSkinInfo.mJointNames );
critiqueRigForUploadApplicability( toStringVector( model->mSkinInfo.mJointNames ) );
// </FS:ND>
critiqueRigForUploadApplicability( model->mSkinInfo.mJointNames );
if ( !missingSkeletonOrScene )
{
@ -1589,11 +1580,7 @@ void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, do
//with the skeleton are not stored in the same order as they are in the exported joint buffer.
//This remaps the skeletal joints to be in the same order as the joints stored in the model.
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
// std::vector<std::string> ::const_iterator jointIt = model->mSkinInfo.mJointNames.begin();
std::vector< std::string > jointNames = toStringVector( model->mSkinInfo.mJointNames );
std::vector<std::string> ::const_iterator jointIt = jointNames.begin();
// </FS:ND>
std::vector<std::string> ::const_iterator jointIt = model->mSkinInfo.mJointNames.begin();
const int jointCnt = static_cast<int>(model->mSkinInfo.mJointNames.size());
for ( int i=0; i<jointCnt; ++i, ++jointIt )

View File

@ -1496,10 +1496,7 @@ void LLMeshSkinInfo::fromLLSD(LLSD& skin)
{
for (U32 i = 0; i < skin["joint_names"].size(); ++i)
{
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
// mJointNames.push_back( skin[ "joint_names" ][ i ] );
mJointNames.push_back( JointKey::construct( skin[ "joint_names" ][ i ] ) );
// </FS>ND>
mJointNames.push_back( skin[ "joint_names" ][ i ] );
mJointNums.push_back(-1);
}
}
@ -1589,10 +1586,7 @@ LLSD LLMeshSkinInfo::asLLSD(bool include_joints, bool lock_scale_if_joint_positi
for (U32 i = 0; i < mJointNames.size(); ++i)
{
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
// ret[ "joint_names" ][ i ] = mJointNames[ i ];
ret[ "joint_names" ][ i ] = mJointNames[ i ].mName;
// </FS:ND>
ret[ "joint_names" ][ i ] = mJointNames[ i ];
for (U32 j = 0; j < 4; j++)
{
@ -1643,9 +1637,7 @@ void LLMeshSkinInfo::updateHash()
//mJointNames
for (auto& name : mJointNames)
{
// <FS:Ansariel> Joint lookup speedup
//hash.update(name);
hash.update(name.mName);
hash.update(name);
}
//mJointNums
@ -1671,10 +1663,7 @@ U32 LLMeshSkinInfo::sizeBytes() const
res += sizeof(std::vector<std::string>) + sizeof(std::string) * static_cast<U32>(mJointNames.size());
for (U32 i = 0; i < mJointNames.size(); ++i)
{
// <FS> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
//res += static_cast<U32>(mJointNames[i].size()); // actual size, not capacity
res += static_cast<U32>(mJointNames[i].mName.size()); // actual size, not capacity
// </FS>
res += static_cast<U32>(mJointNames[i].size()); // actual size, not capacity
}
res += sizeof(std::vector<S32>) + sizeof(S32) * static_cast<U32>(mJointNums.size());

View File

@ -56,10 +56,7 @@ public:
U32 sizeBytes() const;
LLUUID mMeshID;
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
// std::vector<std::string> mJointNames;
std::vector< JointKey > mJointNames;
// </FS:ND>
std::vector<std::string> mJointNames;
mutable std::vector<S32> mJointNums;
typedef std::vector<LLMatrix4a> matrix_list_t;
matrix_list_t mInvBindMatrix;

View File

@ -257,10 +257,7 @@ bool LLModelLoader::loadFromSLM(const std::string& filename)
if (!loaded_model->mSkinInfo.mJointNames.empty())
{
//check to see if rig is valid
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
// critiqueRigForUploadApplicability( loaded_model->mSkinInfo.mJointNames );
critiqueRigForUploadApplicability( toStringVector( loaded_model->mSkinInfo.mJointNames ) );
// </FS:ND>
critiqueRigForUploadApplicability( loaded_model->mSkinInfo.mJointNames );
}
else if (mCacheOnlyHitIfRigged)
{

View File

@ -196,18 +196,6 @@ public:
void clearLog() { mWarningsArray.clear(); }
protected:
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
std::vector< std::string > toStringVector( std::vector< JointKey > const &aIn ) const
{
std::vector< std::string > out;
for( std::vector< JointKey >::const_iterator itr = aIn.begin(); itr != aIn.end(); ++itr )
out.push_back( itr->mName );
return out;
}
// </FS:ND>
LLModelLoader::load_callback_t mLoadCallback;
LLModelLoader::joint_lookup_func_t mJointLookupFunc;
LLModelLoader::texture_load_func_t mTextureLoadFunc;

View File

@ -1652,7 +1652,7 @@ void FSFloaterPoser::updateManipWithFirstSelectedJoint(std::vector<FSPoserAnimat
return;
if (joints.size() >= 1)
FSToolCompPose::getInstance()->setJoint(avatarp->getJoint(JointKey::construct(joints[0]->jointName())));
FSToolCompPose::getInstance()->setJoint(avatarp->getJoint(joints[0]->jointName()));
else
FSToolCompPose::getInstance()->setJoint(nullptr);
}

View File

@ -96,6 +96,13 @@ public:
{
ctrl->getSignal()->connect(boost::bind(&LLFloaterIMNearbyChatScreenChannel::updateToastFadingTime, this));
}
// <FS:darl> [FIRE-35039 > FIRE-35294] Add flag to show/hide the on-screen console
ctrl = gSavedSettings.getControl("FSShowOnscreenConsole").get();
if (ctrl)
{
ctrl->getSignal()->connect(boost::bind(&LLFloaterIMNearbyChatScreenChannel::removeToastsFromChannel, this));
}
// </FS:darl> [FIRE-35039 > FIRE-35294] Add flag to show/hide the on-screen console
}
void addChat (LLSD& chat);
@ -694,6 +701,14 @@ void LLFloaterIMNearbyChatHandler::processChat(const LLChat& chat_msg,
}
// </FS:Ansariel>
// <FS:darl> [FIRE-35039 > FIRE-35294] Add flag to show/hide the on-screen console
static LLUICachedControl<bool> showOnscreenConsole("FSShowOnscreenConsole");
if (!showOnscreenConsole)
{
return;
}
// </FS:darl> [FIRE-35039 > FIRE-35294]
static LLCachedControl<bool> useChatBubbles(gSavedSettings, "UseChatBubbles");
static LLCachedControl<bool> fsBubblesHideConsoleAndToasts(gSavedSettings, "FSBubblesHideConsoleAndToasts");
// <FS:Ansariel> [FS communication UI]

View File

@ -1625,14 +1625,9 @@ void LLFloaterModelPreview::updateAvatarTab(bool highlight_overrides)
for (U32 j = 0; j < joint_count; ++j)
{
const LLVector3& joint_pos = LLVector3(skin->mAlternateBindMatrix[j].getTranslation());
// <FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
//LLJointOverrideData &data = mJointOverrides[display_lod][skin->mJointNames[j]];
LLJointOverrideData &data = mJointOverrides[display_lod][skin->mJointNames[j]];
//LLJoint* pJoint = LLModelPreview::lookupJointByName(skin->mJointNames[j], mModelPreview);
LLJointOverrideData &data = mJointOverrides[display_lod][skin->mJointNames[j].mName];
LLJoint* pJoint = LLModelPreview::lookupJointByName(skin->mJointNames[j].mName, mModelPreview);
// <FS:ND>
LLJoint* pJoint = LLModelPreview::lookupJointByName(skin->mJointNames[j], mModelPreview);
if (pJoint)
{
// see how voavatar uses aboveJointPosThreshold
@ -1661,9 +1656,7 @@ void LLFloaterModelPreview::updateAvatarTab(bool highlight_overrides)
{
for (U32 j = 0; j < joint_count; ++j)
{
// <FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
//LLJointOverrideData &data = mJointOverrides[display_lod][skin->mJointNames[j]];
LLJointOverrideData &data = mJointOverrides[display_lod][skin->mJointNames[j].mName];
LLJointOverrideData &data = mJointOverrides[display_lod][skin->mJointNames[j]];
data.mModelsNoOverrides.insert(model->getName());
}
}

View File

@ -1082,9 +1082,9 @@ void LLFloaterWorldMap::updateLocation()
// mSLURL = LLSLURL(sim_name, pos_global);
// <FS> [FIRE-35268] OpenSim support for when on other grids
if (LLGridManager::getInstance()->isInSecondLife())
mSLURL = LLSLURL(sim_info->getName(), gAgent.getPositionAgent());
mSLURL = LLSLURL(sim_info->getName(), sim_info->getGlobalOrigin(), pos_global);
else
mSLURL = LLSLURL(LFSimFeatureHandler::instance().hyperGridURL(), sim_info->getName(), gAgent.getPositionAgent());
mSLURL = LLSLURL(LFSimFeatureHandler::instance().hyperGridURL(), sim_info->getName(), sim_info->getGlobalOrigin(), pos_global);
// </FS>
}
// </FS:Beq pp Oren>

View File

@ -4185,10 +4185,7 @@ LLJoint* LLModelPreview::lookupJointByName(const std::string& str, void* opaque)
LLModelPreview* pPreview = static_cast< LLModelPreview* >(opaque);
if (pPreview)
{
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
// return pPreview->getPreviewAvatar()->getJoint(str);
return pPreview->getPreviewAvatar()->getJoint( JointKey::construct( str ) );
// <FS:ND>
return pPreview->getPreviewAvatar()->getJoint(str);
}
return NULL;
}

View File

@ -131,10 +131,7 @@ void LLMorphView::updateCamera()
{
if (!mCameraTargetJoint)
{
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
// setCameraTargetJoint( gAgentAvatarp->getJoint( "mHead" ) );
setCameraTargetJoint( gAgentAvatarp->getJoint( JointKey::construct( "mHead" ) ) );
// </FS:ND>
setCameraTargetJoint( gAgentAvatarp->getJoint( "mHead" ) );
}
if (!isAgentAvatarValid()) return;

View File

@ -1316,15 +1316,11 @@ void LLPanelEditWearable::showWearable(LLViewerWearable* wearable, bool show, bo
value_map_t sorted_params;
getSortedParams(sorted_params, edit_group);
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
//LLJoint* jointp = gAgentAvatarp->getJoint( subpart_entry->mTargetJoint );
LLJoint* jointp = gAgentAvatarp->getJoint( JointKey::construct( subpart_entry->mTargetJoint ) );
LLJoint* jointp = gAgentAvatarp->getJoint( subpart_entry->mTargetJoint );
if (!jointp)
{
//jointp = gAgentAvatarp->getJoint( "mHead" );
jointp = gAgentAvatarp->getJoint( JointKey::construct( "mHead" ) );
jointp = gAgentAvatarp->getJoint( "mHead" );
}
// </FS:ND>
buildParamList(panel_list, sorted_params, tab, jointp);
@ -1440,11 +1436,7 @@ void LLPanelEditWearable::changeCamera(U8 subpart)
}
// Update the camera
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
//gMorphView->setCameraTargetJoint( gAgentAvatarp->getJoint( subpart_entry->mTargetJoint ) );
gMorphView->setCameraTargetJoint( gAgentAvatarp->getJoint( JointKey::construct( subpart_entry->mTargetJoint ) ) );
// </FS>ND>
gMorphView->setCameraTargetJoint( gAgentAvatarp->getJoint( subpart_entry->mTargetJoint ) );
gMorphView->setCameraTargetOffset( subpart_entry->mTargetOffset );
gMorphView->setCameraOffset( subpart_entry->mCameraOffset );
if (gSavedSettings.getBOOL("AppearanceCameraMovement"))

View File

@ -54,10 +54,7 @@ void dump_avatar_and_skin_state(const std::string& reason, LLVOAvatar *avatar, c
{
LL_WARNS("Avatar") << "skin joint idx " << j << " name [" << skin->mJointNames[j]
<< "] num " << skin->mJointNums[j] << LL_ENDL;
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
//const std::string& name = skin->mJointNames[j];
const std::string& name = skin->mJointNames[j].mName;
// </FS:ND>
const std::string& name = skin->mJointNames[j];
S32 joint_num = skin->mJointNums[j];
LLJoint *name_joint = avatar->getJoint(name);
@ -119,14 +116,9 @@ void LLSkinningUtil::scrubInvalidJoints(LLVOAvatar *avatar, LLMeshSkinInfo* skin
// needed for handling of any legacy bad data.
if (!avatar->getJoint(skin->mJointNames[j]))
{
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
//LL_DEBUGS("Avatar") << avatar->getFullname() << " mesh rigged to invalid joint " << skin->mJointNames[j] << LL_ENDL;
//LL_WARNS_ONCE("Avatar") << avatar->getFullname() << " mesh rigged to invalid joint" << skin->mJointNames[j] << LL_ENDL;
//skin->mJointNames[j] = "mPelvis";
LL_DEBUGS("Avatar") << avatar->getFullname() << " mesh rigged to invalid joint " << skin->mJointNames[j].mName << LL_ENDL;
LL_WARNS_ONCE("Avatar") << avatar->getFullname() << " mesh rigged to invalid joint" << skin->mJointNames[j].mName << LL_ENDL;
skin->mJointNames[j] = JointKey::construct("mPelvis");
//</FS:ND>
LL_DEBUGS("Avatar") << avatar->getFullname() << " mesh rigged to invalid joint " << skin->mJointNames[j] << LL_ENDL;
LL_WARNS_ONCE("Avatar") << avatar->getFullname() << " mesh rigged to invalid joint" << skin->mJointNames[j] << LL_ENDL;
skin->mJointNames[j] = "mPelvis";
skin->mJointNumsInitialized = false; // force update after names change.
}
}

View File

@ -417,7 +417,7 @@ void LLViewerTextureList::dump()
LL_CONT << " # of Volumes ";
for (S32 index = 0; index < LLRender::NUM_VOLUME_TEXTURE_CHANNELS; index++)
{
LL_CONT << image->getNumVolumes(index) + " ";
LL_CONT << image->getNumVolumes(index) << " ";
}
// </FS:minerjr> [FIRE-35081]
LL_CONT << " http://asset.siva.lindenlab.com/" << image->getID() << ".texture"

View File

@ -7267,69 +7267,44 @@ const LLUUID& LLVOAvatar::getID() const
// getJoint()
//-----------------------------------------------------------------------------
// RN: avatar joints are multi-rooted to include screen-based attachments
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
//<FS:Ansariel> Joint-lookup improvements
//LLJoint *LLVOAvatar::getJoint(const std::string &name)
LLJoint *LLVOAvatar::getJoint(const JointKey &name)
// </FS:ND>
LLJoint *LLVOAvatar::getJoint(std::string_view name)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
//<FS:Ansariel> Joint-lookup improvements
//joint_map_t::iterator iter = mJointMap.find( name );
//LLJoint* jointp = NULL;
//if( iter == mJointMap.end() || iter->second == NULL )
//{ //search for joint and cache found joint in lookup table
// if (mJointAliasMap.empty())
// {
// getJointAliases();
// }
// joint_alias_map_t::const_iterator alias_iter = mJointAliasMap.find(name);
// std::string canonical_name;
// if (alias_iter != mJointAliasMap.end())
// {
// canonical_name = alias_iter->second;
// }
// else
// {
// canonical_name = name;
// }
// jointp = mRoot->findJoint(canonical_name);
// mJointMap[name] = jointp;
//}
//else
//{ //return cached pointer
// jointp = iter->second;
//}
joint_map_t::iterator iter = mJointMap.find( name.mKey );
joint_map_t::iterator iter = mJointMap.find(name.data());
LLJoint* jointp = NULL;
if (iter == mJointMap.end() || iter->second == NULL)
{ //search for joint and cache found joint in lookup table
if (mJointAliasMap.empty())
{
getJointAliases();
}
joint_alias_map_t::const_iterator alias_iter = mJointAliasMap.find(name.mName);
std::string canonical_name;
if (alias_iter != mJointAliasMap.end())
{
canonical_name = alias_iter->second;
}
else
{
canonical_name = name.mName;
}
jointp = mRoot->findJoint(canonical_name);
mJointMap[name.mKey] = jointp;
if( iter == mJointMap.end() || iter->second == NULL )
{ //search for joint and cache found joint in lookup table
if (mJointAliasMap.empty())
{
getJointAliases();
}
//<FS:Ansariel> Joint-lookup improvements
//joint_alias_map_t::const_iterator alias_iter = mJointAliasMap.find(name);
joint_alias_map_t::const_iterator alias_iter = mJointAliasMap.find(std::string(name));
std::string canonical_name;
if (alias_iter != mJointAliasMap.end())
{
canonical_name = alias_iter->second;
}
else
{
canonical_name = name;
}
jointp = mRoot->findJoint(canonical_name);
//<FS:Ansariel> Joint-lookup improvements
//mJointMap[name] = jointp;
mJointMap[std::string(name)] = jointp;
}
else
{ //return cached pointer
jointp = iter->second;
{ //return cached pointer
jointp = iter->second;
}
// </FS:ND>
#ifndef LL_RELEASE_FOR_DOWNLOAD
if (jointp && jointp->getName()!="mScreen" && jointp->getName()!="mRoot")
@ -7373,17 +7348,10 @@ LLJoint *LLVOAvatar::getJoint( S32 joint_num )
void LLVOAvatar::initAllJoints()
{
getJointAliases();
// <FS:Ansariel> Lookup performance changes
//for (auto& alias : mJointAliasMap)
//{
// mJointMap[alias.first] = mRoot->findJoint(alias.second);
// mJointMap[JointKey::construct(alias.first).mKey] = mRoot->findJoint(alias.second);
//}
for (const auto& alias : mJointAliasMap)
for (auto& alias : mJointAliasMap)
{
mJointMap[JointKey::construct(alias.first).mKey] = mRoot->findJoint(alias.second);
mJointMap[alias.first] = mRoot->findJoint(alias.second);
}
// </FS:Ansariel>
// ignore mScreen and mRoot
}
@ -7712,11 +7680,7 @@ void LLVOAvatar::addAttachmentOverridesForObject(LLViewerObject *vo, std::set<LL
{
for (unsigned int i = 0; i < jointCnt; ++i)
{
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
// std::string lookingForJoint = pSkinData->mJointNames[ i ].c_str();
JointKey lookingForJoint = pSkinData->mJointNames[ i ];
// </FS:ND>
std::string lookingForJoint = pSkinData->mJointNames[i].c_str();
LLJoint* pJoint = getJoint( lookingForJoint );
if (pJoint)
{
@ -7729,10 +7693,7 @@ void LLVOAvatar::addAttachmentOverridesForObject(LLViewerObject *vo, std::set<LL
if (override_changed)
{
//If joint is a pelvis then handle old/new pelvis to foot values
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
// if( lookingForJoint == "mPelvis" )
if( lookingForJoint.mName == "mPelvis" )
// </FS:ND>
if( lookingForJoint == "mPelvis" )
{
pelvisGotSet = true;
}
@ -7923,10 +7884,7 @@ void LLVOAvatar::removeAttachmentOverridesForObject(LLViewerObject *vo)
//-----------------------------------------------------------------------------
void LLVOAvatar::removeAttachmentOverridesForObject(const LLUUID& mesh_id)
{
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
// LLJoint* pJointPelvis = getJoint( "mPelvis" );
LLJoint* pJointPelvis = getJoint( JointKey::construct( "mPelvis" ) );
// </FS:ND>
LLJoint* pJointPelvis = getJoint( "mPelvis" );
const std::string av_string = avString();
for (S32 joint_num = 0; joint_num < LL_CHARACTER_MAX_ANIMATED_JOINTS; joint_num++)
@ -8114,10 +8072,7 @@ void LLVOAvatar::initAttachmentPoints(bool ignore_hud_joints)
attachment->setName(info->mName);
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
// LLJoint *parent_joint = getJoint(info->mJointName);
LLJoint *parent_joint = getJoint( JointKey::construct( info->mJointName ) );
// </FS:ND>
LLJoint *parent_joint = getJoint(info->mJointName);
if (!parent_joint)
{

View File

@ -204,11 +204,9 @@ public:
void startDefaultMotions();
void dumpAnimationState();
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
//<FS:Ansariel> Joint-lookup improvements
//virtual LLJoint* getJoint(const std::string &name);
virtual LLJoint* getJoint(const JointKey& name);
LLJoint* getJoint(const std::string& name) { return getJoint(JointKey::construct(name)); }
// </FS:ND>
virtual LLJoint* getJoint(std::string_view name);
LLJoint* getJoint(S32 num);
void initAllJoints();

View File

@ -1029,27 +1029,22 @@ void LLVOAvatarSelf::idleUpdate(LLAgent &agent, const F64 &time)
}
// virtual
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
//<FS:Ansariel> Joint-lookup improvements
//LLJoint *LLVOAvatarSelf::getJoint(const std::string &name)
LLJoint *LLVOAvatarSelf::getJoint(const JointKey& name)
// </FS:ND>
LLJoint* LLVOAvatarSelf::getJoint(std::string_view name)
{
std::lock_guard lock(mJointMapMutex);
LLJoint *jointp = NULL;
jointp = LLVOAvatar::getJoint(name);
if (!jointp && mScreenp)
{
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
//jointp = mScreenp->findJoint(name);
jointp = mScreenp->findJoint(name.mName);
// </FS:ND>
jointp = mScreenp->findJoint(name);
if (jointp)
{
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
//<FS:Ansariel> Joint-lookup improvements
//mJointMap[name] = jointp;
mJointMap[name.mKey] = jointp;
// </FS:ND>
}
mJointMap[std::string(name)] = jointp;
}
}
if (jointp && jointp != mScreenp && jointp != mRoot)
{

View File

@ -91,10 +91,9 @@ public:
/*virtual*/ void stopMotionFromSource(const LLUUID& source_id);
/*virtual*/ void requestStopMotion(LLMotion* motion);
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
//<FS:Ansariel> Joint-lookup improvements
// /*virtual*/ LLJoint* getJoint(const std::string &name);
/*virtual*/ LLJoint* getJoint(const JointKey& name);
// </FS:ND>
/*virtual*/ LLJoint* getJoint(std::string_view name);
/*virtual*/ void renderJoints();

View File

@ -24,9 +24,8 @@
<combo_box.item label="BMP (verlustfrei)" name="BMP"/>
</combo_box>
<slider label="Qualität:" name="image_quality_slider"/>
<text name="local_remember_location_sessions_text">
Ort und Dateiname zwischen Sitzungen speichern
</text>
<combo_box name="local_remember_location_sessions" label="Ort und Dateiname merken"/>
<combo_box name="local_use_timestamp" label="Datum/Zeit in Dateiname verw."/>
<button label="&#x25B6; Auswahl" name="cancel_btn"/>
<flyout_button label="Speichern" name="save_btn" tool_tip="Bild als Datei speichern">
<flyout_button.item label="Speichern" name="save_item"/>

View File

@ -165,7 +165,7 @@ Additional code generously contributed to Firestorm by:
top_pad="4"
width="450"
wrap="true">
Aira Yumi, Albatroz Hird, Alexie Birman, Andromeda Rage, Angus Boyd, Animats, Armin Weatherwax, Ayane Lyla, Casper Warden, Chalice Yao, Chaser Zaks, Chorazin Allen, Cron Stardust, Damian Zhaoying, Dan Threebeards, Dawa Gurbux, Dax Dupont, Denver Maksim, Dragonborn Forzane, Drake Arconis, Felyza Wishbringer, f0rbidden, Fractured Crystal, Geenz Spad, Gibson Firehawk, Hecklezz, Hitomi Tiponi, humbletim, Inusaito Sayori, Jean Severine, Katharine Berry, Kittin Ninetails, Kool Koolhoven, Lance Corrimal, Lassie, Latif Khalifa, Laurent Bechir, Magne Metaverse LLC, Magus Freston, Makidoll, Manami Hokkigai, MartinRJ Fayray, McCabe Maxstead, Melancholy Lemon, Melysmile, Mimika Oh, minerjr, Mister Acacia, MorganMegan, Morgan Pennent, Mysty Saunders, Nagi Michinaga, Name Short, nhede Core, NiranV Dean, Nogardrevlis Lectar, Oren Hurvitz, paperwork, Penny Patton, Peyton Menges, programmtest, Qwerty Venom, rafak360, Rebecca Ashbourne, Revolution Smythe, Romka Swallowtail, Sahkolihaa Contepomi, sal Kaligawa, Samm Florian, Satomi Ahn, Sei Lisa, Sempervirens Oddfellow, Shin Wasp, Shyotl Kuhr, Sione Lomu, Skills Hak, StarlightShining, Sunset Faulkes, Tapple Gao, Testicular Slingshot, Thickbrick Sleaford, Ubit Umarov, Vaalith Jinn, Vincent Sylvester, Whirly Fizzle, Xenhat Liamano, 小滢 Zi Ying, Zwagoth Klaar and others.
Aira Yumi, Albatroz Hird, Alexie Birman, Andromeda Rage, Angus Boyd, Animats, Armin Weatherwax, Ayane Lyla, Casper Warden, Chalice Yao, Chaser Zaks, Chorazin Allen, Cron Stardust, Damian Zhaoying, Dan Threebeards, Dawa Gurbux, Dax Dupont, Denver Maksim, Dragonborn Forzane, Drake Arconis, Felyza Wishbringer, f0rbidden, Fractured Crystal, Geenz Spad, Gibson Firehawk, Hecklezz, Hitomi Tiponi, humbletim, Inusaito Sayori, Jean Severine, Katharine Berry, Kittin Ninetails, Kool Koolhoven, Lance Corrimal, Lassie, Latif Khalifa, Laurent Bechir, Magne Metaverse LLC, Magus Freston, Makidoll, Manami Hokkigai, MartinRJ Fayray, McCabe Maxstead, Melancholy Lemon, Melysmile, Mimika Oh, minerjr, Mister Acacia, MorganMegan, Morgan Pennent, Mysty Saunders, Nagi Michinaga, Name Short, nhede Core, NiranV Dean, Nogardrevlis Lectar, Oren Hurvitz, paperwork, Penny Patton, Peyton Menges, programmtest, Qwerty Venom, rafak360, Rebecca Ashbourne, Revolution Smythe, Romka Swallowtail, Sahkolihaa Contepomi, sal Kaligawa, Samm Florian, Satomi Ahn, Sei Lisa, Sekkmer, Sempervirens Oddfellow, Shin Wasp, Shyotl Kuhr, Sione Lomu, Skills Hak, StarlightShining, Sunset Faulkes, Tapple Gao, Testicular Slingshot, Thickbrick Sleaford, Ubit Umarov, Vaalith Jinn, Vincent Sylvester, Whirly Fizzle, Xenhat Liamano, 小滢 Zi Ying, Zwagoth Klaar and others.
</text>
<text
follows="top|left"

View File

@ -169,42 +169,22 @@
top_pad="8"
follows="left|top"
layout="topleft"
label_width="200"
label="Persist location and filename"
left="10"
width="20"
width="220"
name="local_remember_location_sessions"
control_name="FSRememberSnapshotPathSessions"/>
<text
layout="topleft"
follows="top|left"
height="14"
length="1"
name="local_remember_location_sessions_text"
top_delta="-6"
left_delta="20"
width="200"
wrap="true">
Persist location and filename
</text>
<check_box
top_pad="8"
top_pad="6"
follows="left|top"
layout="topleft"
label_width="200"
label="Include date/time in filename"
left="10"
width="20"
width="220"
name="local_use_timestamp"
control_name="FSSnapshotLocalNamesWithTimestamps"/>
<text
layout="topleft"
follows="top|left"
height="14"
length="1"
name="local_use_timestamp_text"
top_delta="-6"
left_delta="20"
width="200"
wrap="true">
include date/time in filename
</text>
<button
follows="right|bottom"
height="23"

View File

@ -16,9 +16,7 @@
</combo_box>
<slider label="Qualité :" name="image_quality_slider"/>
<button label="&#x25B6; Sélection" name="cancel_btn"/>
<text name="local_remember_location_sessions_text">
Enregistrer L'emplacement et le nom du fichier entre les sessions
</text>
<check_box name="local_remember_location_sessions" label="Enregistrer L'emplacement et le nom du fichier entre les sessions"/>
<flyout_button label="Enregistrer" name="save_btn" tool_tip="Enregistrer l'image en tant que fichier">
<flyout_button.item label="Enregistrer" name="save_item"/>
<flyout_button.item label="Enregistrer sous..." name="saveas_item"/>

View File

@ -17,9 +17,7 @@
<combo_box.item label="BMP (senza perdite)" name="BMP"/>
</combo_box>
<slider label="Qualità:" name="image_quality_slider"/>
<text name="local_remember_location_sessions_text">
Ricorda luogo e nome file tra le sessioni
</text>
<check_box name="local_remember_location_sessions" label="Ricorda luogo e nome file tra le sessioni"/>
<button label="&#x25B6; Seleziona" name="cancel_btn"/>
<flyout_button label="Salva" name="save_btn" tool_tip="Salva immagine come file">
<flyout_button.item label="Salva" name="save_item"/>

View File

@ -14,12 +14,8 @@
<combo_box.item label="BMP (bezstratny)" name="BMP" />
</combo_box>
<slider label="Jakość:" name="image_quality_slider" />
<text name="local_remember_location_sessions_text">
Trzymaj lokalizację i nazwę pliku
</text>
<text name="local_use_timestamp_text">
data/czas w nazwie pliku
</text>
<check_box name="local_remember_location_sessions" label="Trzymaj lokalizację i nazwę pliku"/>
<check_box name="local_use_timestamp" label="data/czas w nazwie pliku"/>
<button label="&#x25B6; Wybór" name="cancel_btn" />
<flyout_button label="Zapisz" name="save_btn" tool_tip="Zapisz obraz do pliku">
<flyout_button.item label="Zapisz" name="save_item" />

View File

@ -24,9 +24,7 @@
<combo_box.item label="BMP (Сжатие без потерь)" name="BMP"/>
</combo_box>
<slider label="Качество:" name="image_quality_slider"/>
<text name="local_remember_location_sessions_text">
Сохранить место и имя файла между сессиями
</text>
<check_box name="local_remember_location_sessions_text" label="Сохранить место и имя файла между сессиями"/>
<button label="&#x25B6; Выбор" name="cancel_btn"/>
<flyout_button label="Сохранить" name="save_btn" tool_tip="Сохранить изображение в файл">
<flyout_button.item label="Сохранить" name="save_item"/>

View File

@ -18,12 +18,8 @@
<combo_box.item label="BMP零失真" name="BMP" />
</combo_box>
<slider label="清晰度:" name="image_quality_slider" />
<text name="local_remember_location_sessions_text">
儲存位置和檔案名
</text>
<text name="local_use_timestamp_text">
檔案名包含日期/時間
</text>
<check_box name="local_remember_location_sessions" label="儲存位置和檔案名"/>
<check_box name="local_use_timestamp" label="檔案名包含日期/時間"/>
<button label="▶ 取消" name="cancel_btn" />
<flyout_button label="儲存" name="save_btn" tool_tip="儲存圖像到檔案">
<flyout_button.item label="儲存" name="save_item" />

View File

@ -673,7 +673,7 @@ bool LLLocalMeshImportDAE::processSkin(daeDatabase* collada_db, daeElement* coll
{
LL_DEBUGS("LocalMesh") << "Found internal joint name: " << joint_name << LL_ENDL;
joint_name = joint_map[joint_name];
skininfo.mJointNames.push_back(JointKey::construct(joint_name));
skininfo.mJointNames.push_back(joint_name);
skininfo.mJointNums.push_back(-1);
}
};
@ -761,7 +761,7 @@ bool LLLocalMeshImportDAE::processSkin(daeDatabase* collada_db, daeElement* coll
jointname_iterator != skininfop->mJointNames.end();
++jointname_iterator, ++jointname_idx)
{
std::string name_lookup = jointname_iterator->mName;
const std::string& name_lookup = *jointname_iterator;
if (joint_map.find(name_lookup) == joint_map.end())
{
pushLog("DAE Importer", "WARNING: Unknown joint named " + name_lookup + " found, skipping over it.");