Merge branch 'master' of https://github.com/FirestormViewer/phoenix-firestorm into jp-translation
commit
a173ca1eb5
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
|
|
|||
|
|
@ -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 )
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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"))
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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="▶ 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"/>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -16,9 +16,7 @@
|
|||
</combo_box>
|
||||
<slider label="Qualité :" name="image_quality_slider"/>
|
||||
<button label="▶ 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"/>
|
||||
|
|
|
|||
|
|
@ -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="▶ 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"/>
|
||||
|
|
|
|||
|
|
@ -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="▶ 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" />
|
||||
|
|
|
|||
|
|
@ -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="▶ Выбор" name="cancel_btn"/>
|
||||
<flyout_button label="Сохранить" name="save_btn" tool_tip="Сохранить изображение в файл">
|
||||
<flyout_button.item label="Сохранить" name="save_item"/>
|
||||
|
|
|
|||
|
|
@ -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" />
|
||||
|
|
|
|||
|
|
@ -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.");
|
||||
|
|
|
|||
Loading…
Reference in New Issue