Merge
commit
0962dd23bd
1
.hgtags
1
.hgtags
|
|
@ -498,3 +498,4 @@ bc61801f614022c920cb5c3df1d7d67a9561ce1f 3.7.22-release
|
|||
3be800e1afad9615442159e388d6d137be7b951e 3.7.23-release
|
||||
d3d0101e980ec95043e0af9b7903045d3bc447e4 3.7.24-release
|
||||
9978a8c3a2ffce4a5e1c186256581c2ac139c9dc 3.7.25-release
|
||||
000e9dda4162cbf0a83ba88558b19473654a09a9 3.7.26-release
|
||||
|
|
|
|||
|
|
@ -2727,11 +2727,11 @@
|
|||
<string>SecondLife.sln</string>
|
||||
</array>
|
||||
<key>command</key>
|
||||
<string>BuildConsole</string>
|
||||
<string>devenv</string>
|
||||
<key>options</key>
|
||||
<array>
|
||||
<string>/build</string>
|
||||
<string>"/cfg=RelWithDebInfo|Win32"</string>
|
||||
<string>"RelWithDebInfo|Win32"</string>
|
||||
</array>
|
||||
</map>
|
||||
<key>configure</key>
|
||||
|
|
@ -2815,11 +2815,11 @@
|
|||
<string>SecondLife.sln</string>
|
||||
</array>
|
||||
<key>command</key>
|
||||
<string>BuildConsole</string>
|
||||
<string>devenv</string>
|
||||
<key>options</key>
|
||||
<array>
|
||||
<string>/build</string>
|
||||
<string>"/cfg=Release|Win32"</string>
|
||||
<string>"Release|Win32"</string>
|
||||
</array>
|
||||
</map>
|
||||
<key>configure</key>
|
||||
|
|
|
|||
|
|
@ -313,6 +313,7 @@ Ciaran Laval
|
|||
Cinder Roxley
|
||||
BUG-2326
|
||||
BUG-3863
|
||||
BUG-8786
|
||||
OPEN-185
|
||||
OPEN-282
|
||||
STORM-1703
|
||||
|
|
|
|||
|
|
@ -138,7 +138,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
|||
set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION "com.apple.compilers.llvm.clang.1_0")
|
||||
set(CMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL 3)
|
||||
set(CMAKE_XCODE_ATTRIBUTE_GCC_STRICT_ALIASING NO)
|
||||
set(CMAKE_XCODE_ATTRIBUTE_GCC_FAST_MATH YES)
|
||||
set(CMAKE_XCODE_ATTRIBUTE_GCC_FAST_MATH NO)
|
||||
set(CMAKE_XCODE_ATTRIBUTE_CLANG_X86_VECTOR_INSTRUCTIONS ssse3)
|
||||
set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libstdc++")
|
||||
set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT dwarf-with-dsym)
|
||||
|
|
|
|||
|
|
@ -261,6 +261,9 @@ public:
|
|||
static std::vector< LLCharacter* > sInstances;
|
||||
static BOOL sAllowInstancesChange ; //debug use
|
||||
|
||||
virtual void setHoverOffset(const LLVector3& hover_offset, bool send_update=true) { mHoverOffset = hover_offset; }
|
||||
const LLVector3& getHoverOffset() const { return mHoverOffset; }
|
||||
|
||||
protected:
|
||||
LLMotionController mMotionController;
|
||||
|
||||
|
|
@ -273,7 +276,6 @@ protected:
|
|||
U32 mSkeletonSerialNum;
|
||||
LLAnimPauseRequest mPauseRequest;
|
||||
|
||||
|
||||
private:
|
||||
// visual parameter stuff
|
||||
typedef std::map<S32, LLVisualParam *> visual_param_index_map_t;
|
||||
|
|
@ -284,6 +286,8 @@ private:
|
|||
visual_param_name_map_t mVisualParamNameMap;
|
||||
|
||||
static LLStringTable sVisualParamNames;
|
||||
|
||||
LLVector3 mHoverOffset;
|
||||
};
|
||||
|
||||
#endif // LL_LLCHARACTER_H
|
||||
|
|
|
|||
|
|
@ -290,7 +290,7 @@ const LLVector3& LLJoint::getPosition()
|
|||
|
||||
bool do_debug_joint(const std::string& name)
|
||||
{
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -1383,3 +1383,5 @@ char const* const _PREHASH_GroupAVSounds = LLMessageStringTable::getInstance()->
|
|||
char const* const _PREHASH_AppearanceData = LLMessageStringTable::getInstance()->getString("AppearanceData");
|
||||
char const* const _PREHASH_AppearanceVersion = LLMessageStringTable::getInstance()->getString("AppearanceVersion");
|
||||
char const* const _PREHASH_CofVersion = LLMessageStringTable::getInstance()->getString("CofVersion");
|
||||
char const* const _PREHASH_AppearanceHover = LLMessageStringTable::getInstance()->getString("AppearanceHover");
|
||||
char const* const _PREHASH_HoverHeight = LLMessageStringTable::getInstance()->getString("HoverHeight");
|
||||
|
|
|
|||
|
|
@ -1383,4 +1383,6 @@ extern char const* const _PREHASH_GroupAVSounds;
|
|||
extern char const* const _PREHASH_AppearanceData;
|
||||
extern char const* const _PREHASH_AppearanceVersion;
|
||||
extern char const* const _PREHASH_CofVersion;
|
||||
extern char const* const _PREHASH_AppearanceHover;
|
||||
extern char const* const _PREHASH_HoverHeight;
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -56,7 +56,8 @@ LLSliderCtrl::LLSliderCtrl(const LLSliderCtrl::Params& p)
|
|||
mPrecision(p.decimal_digits),
|
||||
mTextEnabledColor(p.text_color()),
|
||||
mTextDisabledColor(p.text_disabled_color()),
|
||||
mLabelWidth(p.label_width)
|
||||
mLabelWidth(p.label_width),
|
||||
mEditorCommitSignal(NULL)
|
||||
{
|
||||
S32 top = getRect().getHeight();
|
||||
S32 bottom = 0;
|
||||
|
|
@ -194,6 +195,11 @@ LLSliderCtrl::LLSliderCtrl(const LLSliderCtrl::Params& p)
|
|||
updateText();
|
||||
}
|
||||
|
||||
LLSliderCtrl::~LLSliderCtrl()
|
||||
{
|
||||
delete mEditorCommitSignal;
|
||||
}
|
||||
|
||||
// static
|
||||
void LLSliderCtrl::onEditorGainFocus( LLFocusableElement* caller, void *userdata )
|
||||
{
|
||||
|
|
@ -306,6 +312,8 @@ void LLSliderCtrl::onEditorCommit( LLUICtrl* ctrl, const LLSD& userdata )
|
|||
if( success )
|
||||
{
|
||||
self->onCommit();
|
||||
if (self->mEditorCommitSignal)
|
||||
(*(self->mEditorCommitSignal))(self, self->getValueF32());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -419,6 +427,11 @@ boost::signals2::connection LLSliderCtrl::setSliderMouseUpCallback( const commit
|
|||
return mSlider->setMouseUpCallback( cb );
|
||||
}
|
||||
|
||||
boost::signals2::connection LLSliderCtrl::setSliderEditorCommitCallback( const commit_signal_t::slot_type& cb )
|
||||
{
|
||||
if (!mEditorCommitSignal) mEditorCommitSignal = new commit_signal_t();
|
||||
return mEditorCommitSignal->connect(cb);
|
||||
}
|
||||
void LLSliderCtrl::onTabInto()
|
||||
{
|
||||
if( mEditor )
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ protected:
|
|||
LLSliderCtrl(const Params&);
|
||||
friend class LLUICtrlFactory;
|
||||
public:
|
||||
virtual ~LLSliderCtrl() {} // Children all cleaned up by default view destructor.
|
||||
virtual ~LLSliderCtrl();
|
||||
|
||||
/*virtual*/ F32 getValueF32() const { return mSlider->getValueF32(); }
|
||||
void setValue(F32 v, BOOL from_event = FALSE);
|
||||
|
|
@ -112,6 +112,7 @@ public:
|
|||
|
||||
boost::signals2::connection setSliderMouseDownCallback( const commit_signal_t::slot_type& cb );
|
||||
boost::signals2::connection setSliderMouseUpCallback( const commit_signal_t::slot_type& cb );
|
||||
boost::signals2::connection setSliderEditorCommitCallback( const commit_signal_t::slot_type& cb );
|
||||
|
||||
/*virtual*/ void onTabInto();
|
||||
|
||||
|
|
@ -150,6 +151,8 @@ private:
|
|||
|
||||
LLUIColor mTextEnabledColor;
|
||||
LLUIColor mTextDisabledColor;
|
||||
|
||||
commit_signal_t* mEditorCommitSignal;
|
||||
};
|
||||
|
||||
#endif // LL_LLSLIDERCTRL_H
|
||||
|
|
|
|||
|
|
@ -250,6 +250,7 @@ set(viewer_SOURCE_FILES
|
|||
llfloaterhandler.cpp
|
||||
llfloaterhardwaresettings.cpp
|
||||
llfloaterhelpbrowser.cpp
|
||||
llfloaterhoverheight.cpp
|
||||
llfloaterhud.cpp
|
||||
llfloaterimagepreview.cpp
|
||||
llfloaterimsessiontab.cpp
|
||||
|
|
@ -855,6 +856,7 @@ set(viewer_HEADER_FILES
|
|||
llfloaterhandler.h
|
||||
llfloaterhardwaresettings.h
|
||||
llfloaterhelpbrowser.h
|
||||
llfloaterhoverheight.h
|
||||
llfloaterhud.h
|
||||
llfloaterimagepreview.h
|
||||
llfloaterimnearbychat.h
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
3.7.26
|
||||
3.7.27
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@
|
|||
<key>tags</key>
|
||||
<array>
|
||||
<!-- sample entry for debugging specific items
|
||||
<string>Avatar</string>
|
||||
<string>Inventory</string>
|
||||
<string>SceneLoadTiming</string>
|
||||
<string>Avatar</string>
|
||||
|
|
|
|||
|
|
@ -654,6 +654,21 @@
|
|||
<key>Value</key>
|
||||
<integer>2</integer>
|
||||
</map>
|
||||
<key>AvatarPosFinalOffset</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>After-everything-else fixup for avatar position.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Vector3</string>
|
||||
<key>Value</key>
|
||||
<array>
|
||||
<real>0.0</real>
|
||||
<real>0.0</real>
|
||||
<real>0.0</real>
|
||||
</array>
|
||||
</map>
|
||||
<key>AvatarPickerURL</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,16 @@
|
|||
<llsd>
|
||||
<map>
|
||||
<key>AvatarHoverOffsetZ</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>After-everything-else fixup for avatar Z position.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>0.0</real>
|
||||
</map>
|
||||
<key>DoNotDisturbResponseChanged</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -480,7 +480,7 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
|
|||
const LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
|
||||
if (item->getParentUUID() == favorites_id)
|
||||
{
|
||||
LL_WARNS() << "Attemt to copy a favorite item into the same folder." << LL_ENDL;
|
||||
LL_WARNS("FavoritesBar") << "Attemt to copy a favorite item into the same folder." << LL_ENDL;
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -632,7 +632,7 @@ void LLFavoritesBarCtrl::handleNewFavoriteDragAndDrop(LLInventoryItem *item, con
|
|||
// landmarks to an empty favorites bar.
|
||||
updateButtons();
|
||||
|
||||
LL_INFOS() << "Copied inventory item #" << item->getUUID() << " to favorites." << LL_ENDL;
|
||||
LL_INFOS("FavoritesBar") << "Copied inventory item #" << item->getUUID() << " to favorites." << LL_ENDL;
|
||||
}
|
||||
|
||||
//virtual
|
||||
|
|
@ -871,7 +871,7 @@ LLButton* LLFavoritesBarCtrl::createButton(const LLPointer<LLViewerInventoryItem
|
|||
fav_btn = LLUICtrlFactory::create<LLFavoriteLandmarkButton>(fav_btn_params);
|
||||
if (NULL == fav_btn)
|
||||
{
|
||||
LL_WARNS() << "Unable to create LLFavoriteLandmarkButton widget: " << item->getName() << LL_ENDL;
|
||||
LL_WARNS("FavoritesBar") << "Unable to create LLFavoriteLandmarkButton widget: " << item->getName() << LL_ENDL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
@ -1160,7 +1160,7 @@ bool LLFavoritesBarCtrl::enableSelected(const LLSD& userdata)
|
|||
void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata)
|
||||
{
|
||||
std::string action = userdata.asString();
|
||||
LL_INFOS() << "Action = " << action << " Item = " << mSelectedItemID.asString() << LL_ENDL;
|
||||
LL_INFOS("FavoritesBar") << "Action = " << action << " Item = " << mSelectedItemID.asString() << LL_ENDL;
|
||||
|
||||
LLViewerInventoryItem* item = gInventory.getItem(mSelectedItemID);
|
||||
if (!item)
|
||||
|
|
@ -1444,10 +1444,24 @@ void LLFavoritesOrderStorage::getSLURL(const LLUUID& asset_id)
|
|||
boost::bind(&LLFavoritesOrderStorage::onLandmarkLoaded, this, asset_id, _1));
|
||||
if (lm)
|
||||
{
|
||||
LL_DEBUGS("FavoritesBar") << "landmark for " << asset_id << " already loaded" << LL_ENDL;
|
||||
onLandmarkLoaded(asset_id, lm);
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
std::string LLFavoritesOrderStorage::getStoredFavoritesFilename()
|
||||
{
|
||||
std::string user_dir = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "");
|
||||
|
||||
return (user_dir.empty() ? ""
|
||||
: gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
|
||||
"stored_favorites_"
|
||||
+ LLGridManager::getInstance()->getGrid()
|
||||
+ ".xml")
|
||||
);
|
||||
}
|
||||
|
||||
// static
|
||||
void LLFavoritesOrderStorage::destroyClass()
|
||||
{
|
||||
|
|
@ -1459,7 +1473,11 @@ void LLFavoritesOrderStorage::destroyClass()
|
|||
file.open(old_filename);
|
||||
if (file.is_open())
|
||||
{
|
||||
std::string new_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites_" + LLGridManager::getInstance()->getGrid() + ".xml");
|
||||
file.close();
|
||||
std::string new_filename = getStoredFavoritesFilename();
|
||||
LL_INFOS("FavoritesBar") << "moving favorites from old name '" << old_filename
|
||||
<< "' to new name '" << new_filename << "'"
|
||||
<< LL_ENDL;
|
||||
LLFile::copy(old_filename,new_filename);
|
||||
LLFile::remove(old_filename);
|
||||
}
|
||||
|
|
@ -1474,10 +1492,19 @@ void LLFavoritesOrderStorage::destroyClass()
|
|||
}
|
||||
}
|
||||
|
||||
std::string LLFavoritesOrderStorage::getSavedOrderFileName()
|
||||
{
|
||||
// If we quit from the login screen we will not have an SL account
|
||||
// name. Don't try to save, otherwise we'll dump a file in
|
||||
// C:\Program Files\SecondLife\ or similar. JC
|
||||
std::string user_dir = gDirUtilp->getLindenUserDir();
|
||||
return (user_dir.empty() ? "" : gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME));
|
||||
}
|
||||
|
||||
void LLFavoritesOrderStorage::load()
|
||||
{
|
||||
// load per-resident sorting information
|
||||
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME);
|
||||
std::string filename = getSavedOrderFileName();
|
||||
|
||||
LLSD settings_llsd;
|
||||
llifstream file;
|
||||
|
|
@ -1485,7 +1512,15 @@ void LLFavoritesOrderStorage::load()
|
|||
if (file.is_open())
|
||||
{
|
||||
LLSDSerialize::fromXML(settings_llsd, file);
|
||||
LL_INFOS("FavoritesBar") << "loaded favorites order from '" << filename << "' "
|
||||
<< (settings_llsd.isMap() ? "" : "un") << "successfully"
|
||||
<< LL_ENDL;
|
||||
file.close();
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS("FavoritesBar") << "unable to open favorites order file at '" << filename << "'" << LL_ENDL;
|
||||
}
|
||||
|
||||
for (LLSD::map_const_iterator iter = settings_llsd.beginMap();
|
||||
iter != settings_llsd.endMap(); ++iter)
|
||||
|
|
@ -1499,92 +1534,120 @@ void LLFavoritesOrderStorage::saveFavoritesSLURLs()
|
|||
// Do not change the file if we are not logged in yet.
|
||||
if (!LLLoginInstance::getInstance()->authSuccess())
|
||||
{
|
||||
LL_WARNS() << "Cannot save favorites: not logged in" << LL_ENDL;
|
||||
LL_WARNS("FavoritesBar") << "Cannot save favorites: not logged in" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
std::string user_dir = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "");
|
||||
if (user_dir.empty())
|
||||
{
|
||||
LL_WARNS() << "Cannot save favorites: empty user dir name" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
std::string filename = getStoredFavoritesFilename();
|
||||
if (!filename.empty())
|
||||
{
|
||||
llifstream in_file;
|
||||
in_file.open(filename);
|
||||
LLSD fav_llsd;
|
||||
if (in_file.is_open())
|
||||
{
|
||||
LLSDSerialize::fromXML(fav_llsd, in_file);
|
||||
LL_INFOS("FavoritesBar") << "loaded favorites from '" << filename << "' "
|
||||
<< (fav_llsd.isMap() ? "" : "un") << "successfully"
|
||||
<< LL_ENDL;
|
||||
in_file.close();
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS("FavoritesBar") << "unable to open favorites from '" << filename << "'" << LL_ENDL;
|
||||
}
|
||||
|
||||
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites_" + LLGridManager::getInstance()->getGrid() + ".xml");
|
||||
llifstream in_file;
|
||||
in_file.open(filename);
|
||||
LLSD fav_llsd;
|
||||
if (in_file.is_open())
|
||||
{
|
||||
LLSDSerialize::fromXML(fav_llsd, in_file);
|
||||
}
|
||||
const LLUUID fav_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
|
||||
LLInventoryModel::cat_array_t cats;
|
||||
LLInventoryModel::item_array_t items;
|
||||
gInventory.collectDescendents(fav_id, cats, items, LLInventoryModel::EXCLUDE_TRASH);
|
||||
|
||||
const LLUUID fav_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
|
||||
LLInventoryModel::cat_array_t cats;
|
||||
LLInventoryModel::item_array_t items;
|
||||
gInventory.collectDescendents(fav_id, cats, items, LLInventoryModel::EXCLUDE_TRASH);
|
||||
LLSD user_llsd;
|
||||
for (LLInventoryModel::item_array_t::iterator it = items.begin(); it != items.end(); it++)
|
||||
{
|
||||
LLSD value;
|
||||
value["name"] = (*it)->getName();
|
||||
value["asset_id"] = (*it)->getAssetUUID();
|
||||
|
||||
LLSD user_llsd;
|
||||
for (LLInventoryModel::item_array_t::iterator it = items.begin(); it != items.end(); it++)
|
||||
{
|
||||
LLSD value;
|
||||
value["name"] = (*it)->getName();
|
||||
value["asset_id"] = (*it)->getAssetUUID();
|
||||
slurls_map_t::iterator slurl_iter = mSLURLs.find(value["asset_id"]);
|
||||
if (slurl_iter != mSLURLs.end())
|
||||
{
|
||||
LL_DEBUGS("FavoritesBar") << "Saving favorite: idx=" << LLFavoritesOrderStorage::instance().getSortIndex((*it)->getUUID()) << ", SLURL=" << slurl_iter->second << ", value=" << value << LL_ENDL;
|
||||
value["slurl"] = slurl_iter->second;
|
||||
user_llsd[LLFavoritesOrderStorage::instance().getSortIndex((*it)->getUUID())] = value;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS("FavoritesBar") << "Not saving favorite " << value["name"] << ": no matching SLURL" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
slurls_map_t::iterator slurl_iter = mSLURLs.find(value["asset_id"]);
|
||||
if (slurl_iter != mSLURLs.end())
|
||||
{
|
||||
LL_DEBUGS() << "Saving favorite: idx=" << LLFavoritesOrderStorage::instance().getSortIndex((*it)->getUUID()) << ", SLURL=" << slurl_iter->second << ", value=" << value << LL_ENDL;
|
||||
value["slurl"] = slurl_iter->second;
|
||||
user_llsd[LLFavoritesOrderStorage::instance().getSortIndex((*it)->getUUID())] = value;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "Not saving favorite " << value["name"] << ": no matching SLURL" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
LLAvatarName av_name;
|
||||
LLAvatarNameCache::get( gAgentID, &av_name );
|
||||
// Note : use the "John Doe" and not the "john.doe" version of the name
|
||||
// as we'll compare it with the stored credentials in the login panel.
|
||||
fav_llsd[av_name.getUserName()] = user_llsd;
|
||||
|
||||
LLAvatarName av_name;
|
||||
LLAvatarNameCache::get( gAgentID, &av_name );
|
||||
// Note : use the "John Doe" and not the "john.doe" version of the name
|
||||
// as we'll compare it with the stored credentials in the login panel.
|
||||
LL_DEBUGS() << "Saved favorites for " << av_name.getUserName() << LL_ENDL;
|
||||
fav_llsd[av_name.getUserName()] = user_llsd;
|
||||
|
||||
llofstream file;
|
||||
file.open(filename);
|
||||
LLSDSerialize::toPrettyXML(fav_llsd, file);
|
||||
llofstream file;
|
||||
file.open(filename);
|
||||
if ( file.is_open() )
|
||||
{
|
||||
LLSDSerialize::toPrettyXML(fav_llsd, file);
|
||||
LL_INFOS("FavoritesBar") << "saved favorites for '" << av_name.getUserName()
|
||||
<< "' to '" << filename << "' "
|
||||
<< LL_ENDL;
|
||||
file.close();
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS("FavoritesBar") << "unable to open favorites storage for '" << av_name.getUserName()
|
||||
<< "' at '" << filename << "' "
|
||||
<< LL_ENDL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLFavoritesOrderStorage::removeFavoritesRecordOfUser()
|
||||
{
|
||||
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites_" + LLGridManager::getInstance()->getGrid() + ".xml");
|
||||
LLSD fav_llsd;
|
||||
llifstream file;
|
||||
file.open(filename);
|
||||
if (!file.is_open()) return;
|
||||
LLSDSerialize::fromXML(fav_llsd, file);
|
||||
|
||||
LLAvatarName av_name;
|
||||
LLAvatarNameCache::get( gAgentID, &av_name );
|
||||
// Note : use the "John Doe" and not the "john.doe" version of the name.
|
||||
// See saveFavoritesSLURLs() here above for the reason why.
|
||||
LL_DEBUGS() << "Removed favorites for " << av_name.getUserName() << LL_ENDL;
|
||||
if (fav_llsd.has(av_name.getUserName()))
|
||||
{
|
||||
fav_llsd.erase(av_name.getUserName());
|
||||
}
|
||||
|
||||
llofstream out_file;
|
||||
out_file.open(filename);
|
||||
LLSDSerialize::toPrettyXML(fav_llsd, out_file);
|
||||
|
||||
std::string filename = getStoredFavoritesFilename();
|
||||
if (!filename.empty())
|
||||
{
|
||||
LLSD fav_llsd;
|
||||
llifstream file;
|
||||
file.open(filename);
|
||||
if (file.is_open())
|
||||
{
|
||||
LLSDSerialize::fromXML(fav_llsd, file);
|
||||
file.close();
|
||||
|
||||
LLAvatarName av_name;
|
||||
LLAvatarNameCache::get( gAgentID, &av_name );
|
||||
// Note : use the "John Doe" and not the "john.doe" version of the name.
|
||||
// See saveFavoritesSLURLs() here above for the reason why.
|
||||
if (fav_llsd.has(av_name.getUserName()))
|
||||
{
|
||||
LL_INFOS("FavoritesBar") << "Removed favorites for " << av_name.getUserName() << LL_ENDL;
|
||||
fav_llsd.erase(av_name.getUserName());
|
||||
}
|
||||
|
||||
llofstream out_file;
|
||||
out_file.open(filename);
|
||||
if ( out_file.is_open() )
|
||||
{
|
||||
LLSDSerialize::toPrettyXML(fav_llsd, out_file);
|
||||
LL_INFOS("FavoritesBar") << "saved favorites to '" << filename << "' "
|
||||
<< LL_ENDL;
|
||||
out_file.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLFavoritesOrderStorage::onLandmarkLoaded(const LLUUID& asset_id, LLLandmark* landmark)
|
||||
{
|
||||
if (!landmark) return;
|
||||
|
||||
if (landmark)
|
||||
{
|
||||
LL_DEBUGS("FavoritesBar") << "landmark for " << asset_id << " loaded" << LL_ENDL;
|
||||
LLVector3d pos_global;
|
||||
if (!landmark->getGlobalPos(pos_global))
|
||||
{
|
||||
|
|
@ -1595,42 +1658,54 @@ void LLFavoritesOrderStorage::onLandmarkLoaded(const LLUUID& asset_id, LLLandmar
|
|||
|
||||
if (!pos_global.isExactlyZero())
|
||||
{
|
||||
LL_DEBUGS("FavoritesBar") << "requesting slurl for landmark " << asset_id << LL_ENDL;
|
||||
LLLandmarkActions::getSLURLfromPosGlobal(pos_global,
|
||||
boost::bind(&LLFavoritesOrderStorage::storeFavoriteSLURL, this, asset_id, _1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLFavoritesOrderStorage::storeFavoriteSLURL(const LLUUID& asset_id, std::string& slurl)
|
||||
{
|
||||
LL_DEBUGS() << "Saving landmark SLURL: " << slurl << LL_ENDL;
|
||||
LL_DEBUGS("FavoritesBar") << "Saving landmark SLURL '" << slurl << "' for " << asset_id << LL_ENDL;
|
||||
mSLURLs[asset_id] = slurl;
|
||||
}
|
||||
|
||||
void LLFavoritesOrderStorage::save()
|
||||
{
|
||||
// nothing to save if clean
|
||||
if (!mIsDirty) return;
|
||||
if (mIsDirty)
|
||||
{
|
||||
// something changed, so save it
|
||||
std::string filename = LLFavoritesOrderStorage::getInstance()->getSavedOrderFileName();
|
||||
if (!filename.empty())
|
||||
{
|
||||
LLSD settings_llsd;
|
||||
|
||||
// If we quit from the login screen we will not have an SL account
|
||||
// name. Don't try to save, otherwise we'll dump a file in
|
||||
// C:\Program Files\SecondLife\ or similar. JC
|
||||
std::string user_dir = gDirUtilp->getLindenUserDir();
|
||||
if (!user_dir.empty())
|
||||
{
|
||||
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME);
|
||||
LLSD settings_llsd;
|
||||
for(sort_index_map_t::const_iterator iter = mSortIndexes.begin(); iter != mSortIndexes.end(); ++iter)
|
||||
{
|
||||
settings_llsd[iter->first.asString()] = iter->second;
|
||||
}
|
||||
|
||||
for(sort_index_map_t::const_iterator iter = mSortIndexes.begin(); iter != mSortIndexes.end(); ++iter)
|
||||
{
|
||||
settings_llsd[iter->first.asString()] = iter->second;
|
||||
}
|
||||
|
||||
llofstream file;
|
||||
file.open(filename);
|
||||
LLSDSerialize::toPrettyXML(settings_llsd, file);
|
||||
}
|
||||
llofstream file;
|
||||
file.open(filename);
|
||||
if ( file.is_open() )
|
||||
{
|
||||
LLSDSerialize::toPrettyXML(settings_llsd, file);
|
||||
LL_INFOS("FavoritesBar") << "saved favorites order to '" << filename << "' " << LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS("FavoritesBar") << "failed to open favorites order file '" << filename << "' " << LL_ENDL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_DEBUGS("FavoritesBar") << "no user directory available to store favorites order file" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LLFavoritesOrderStorage::cleanup()
|
||||
{
|
||||
// nothing to clean
|
||||
|
|
|
|||
|
|
@ -162,19 +162,7 @@ private:
|
|||
|
||||
boost::signals2::connection mEndDragConnection;
|
||||
};
|
||||
/*
|
||||
class AddFavoriteLandmarkCallback : public LLInventoryCallback
|
||||
{
|
||||
public:
|
||||
AddFavoriteLandmarkCallback() : mTargetLandmarkId(LLUUID::null) {}
|
||||
void setTargetLandmarkId(const LLUUID& target_uuid) { mTargetLandmarkId = target_uuid; }
|
||||
|
||||
private:
|
||||
void fire(const LLUUID& inv_item);
|
||||
|
||||
LLUUID mTargetLandmarkId;
|
||||
};
|
||||
*/
|
||||
/**
|
||||
* Class to store sorting order of favorites landmarks in a local file. EXT-3985.
|
||||
* It replaced previously implemented solution to store sort index in landmark's name as a "<N>@" prefix.
|
||||
|
|
@ -222,14 +210,16 @@ private:
|
|||
friend class LLSingleton<LLFavoritesOrderStorage>;
|
||||
LLFavoritesOrderStorage() : mIsDirty(false) { load(); }
|
||||
~LLFavoritesOrderStorage() { save(); }
|
||||
|
||||
|
||||
/**
|
||||
* Removes sort indexes for items which are not in Favorites bar for now.
|
||||
*/
|
||||
void cleanup();
|
||||
|
||||
const static std::string SORTING_DATA_FILE_NAME;
|
||||
|
||||
std::string getSavedOrderFileName();
|
||||
static std::string getStoredFavoritesFilename();
|
||||
|
||||
void load();
|
||||
void save();
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,157 @@
|
|||
/**
|
||||
* @file llfloaterhoverheight.cpp
|
||||
* @brief Controller for self avatar hover height
|
||||
* @author vir@lindenlab.com
|
||||
*
|
||||
* $LicenseInfo:firstyear=2014&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2014, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llfloaterhoverheight.h"
|
||||
#include "llsliderctrl.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llsdserialize.h"
|
||||
#include "llhttpclient.h"
|
||||
#include "llagent.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "llvoavatarself.h"
|
||||
|
||||
LLFloaterHoverHeight::LLFloaterHoverHeight(const LLSD& key) : LLFloater(key)
|
||||
{
|
||||
}
|
||||
|
||||
void LLFloaterHoverHeight::syncFromPreferenceSetting(void *user_data)
|
||||
{
|
||||
F32 value = gSavedPerAccountSettings.getF32("AvatarHoverOffsetZ");
|
||||
|
||||
LLFloaterHoverHeight *self = static_cast<LLFloaterHoverHeight*>(user_data);
|
||||
LLSliderCtrl* sldrCtrl = self->getChild<LLSliderCtrl>("HoverHeightSlider");
|
||||
sldrCtrl->setValue(value,FALSE);
|
||||
|
||||
if (isAgentAvatarValid())
|
||||
{
|
||||
LLVector3 offset(0.0, 0.0, llclamp(value,MIN_HOVER_Z,MAX_HOVER_Z));
|
||||
LL_INFOS("Avatar") << "setting hover from preference setting " << offset[2] << LL_ENDL;
|
||||
gAgentAvatarp->setHoverOffset(offset);
|
||||
//gAgentAvatarp->sendHoverHeight();
|
||||
}
|
||||
}
|
||||
|
||||
BOOL LLFloaterHoverHeight::postBuild()
|
||||
{
|
||||
LLSliderCtrl* sldrCtrl = getChild<LLSliderCtrl>("HoverHeightSlider");
|
||||
sldrCtrl->setMinValue(MIN_HOVER_Z);
|
||||
sldrCtrl->setMaxValue(MAX_HOVER_Z);
|
||||
sldrCtrl->setSliderMouseUpCallback(boost::bind(&LLFloaterHoverHeight::onFinalCommit,this));
|
||||
sldrCtrl->setSliderEditorCommitCallback(boost::bind(&LLFloaterHoverHeight::onFinalCommit,this));
|
||||
childSetCommitCallback("HoverHeightSlider", &LLFloaterHoverHeight::onSliderMoved, NULL);
|
||||
|
||||
// Initialize slider from pref setting.
|
||||
syncFromPreferenceSetting(this);
|
||||
// Update slider on future pref changes.
|
||||
if (gSavedPerAccountSettings.getControl("AvatarHoverOffsetZ"))
|
||||
{
|
||||
gSavedPerAccountSettings.getControl("AvatarHoverOffsetZ")->getCommitSignal()->connect(boost::bind(&syncFromPreferenceSetting, this));
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "Control not found for AvatarHoverOffsetZ" << LL_ENDL;
|
||||
}
|
||||
|
||||
updateEditEnabled();
|
||||
|
||||
if (!mRegionChangedSlot.connected())
|
||||
{
|
||||
mRegionChangedSlot = gAgent.addRegionChangedCallback(boost::bind(&LLFloaterHoverHeight::onRegionChanged,this));
|
||||
}
|
||||
// Set up based on initial region.
|
||||
onRegionChanged();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void LLFloaterHoverHeight::onClose(bool app_quitting)
|
||||
{
|
||||
if (mRegionChangedSlot.connected())
|
||||
{
|
||||
mRegionChangedSlot.disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLFloaterHoverHeight::onSliderMoved(LLUICtrl* ctrl, void* userData)
|
||||
{
|
||||
LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
|
||||
F32 value = sldrCtrl->getValueF32();
|
||||
LLVector3 offset(0.0, 0.0, llclamp(value,MIN_HOVER_Z,MAX_HOVER_Z));
|
||||
LL_INFOS("Avatar") << "setting hover from slider moved" << offset[2] << LL_ENDL;
|
||||
gAgentAvatarp->setHoverOffset(offset, false);
|
||||
}
|
||||
|
||||
// Do send-to-the-server work when slider drag completes, or new
|
||||
// value entered as text.
|
||||
void LLFloaterHoverHeight::onFinalCommit()
|
||||
{
|
||||
LLSliderCtrl* sldrCtrl = getChild<LLSliderCtrl>("HoverHeightSlider");
|
||||
F32 value = sldrCtrl->getValueF32();
|
||||
gSavedPerAccountSettings.setF32("AvatarHoverOffsetZ",value);
|
||||
|
||||
LLVector3 offset(0.0, 0.0, llclamp(value,MIN_HOVER_Z,MAX_HOVER_Z));
|
||||
LL_INFOS("Avatar") << "setting hover from slider final commit " << offset[2] << LL_ENDL;
|
||||
gAgentAvatarp->setHoverOffset(offset, true); // will send update this time.
|
||||
}
|
||||
|
||||
void LLFloaterHoverHeight::onRegionChanged()
|
||||
{
|
||||
LLViewerRegion *region = gAgent.getRegion();
|
||||
if (region && region->simulatorFeaturesReceived())
|
||||
{
|
||||
updateEditEnabled();
|
||||
}
|
||||
else if (region)
|
||||
{
|
||||
region->setSimulatorFeaturesReceivedCallback(boost::bind(&LLFloaterHoverHeight::onSimulatorFeaturesReceived,this,_1));
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterHoverHeight::onSimulatorFeaturesReceived(const LLUUID ®ion_id)
|
||||
{
|
||||
LLViewerRegion *region = gAgent.getRegion();
|
||||
if (region && (region->getRegionID()==region_id))
|
||||
{
|
||||
updateEditEnabled();
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterHoverHeight::updateEditEnabled()
|
||||
{
|
||||
bool enabled = gAgent.getRegion() && gAgent.getRegion()->avatarHoverHeightEnabled();
|
||||
LLSliderCtrl* sldrCtrl = getChild<LLSliderCtrl>("HoverHeightSlider");
|
||||
sldrCtrl->setEnabled(enabled);
|
||||
if (enabled)
|
||||
{
|
||||
syncFromPreferenceSetting(this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
/**
|
||||
* @file llfloaterhoverheight.h
|
||||
* @brief Controller for self avatar hover height.
|
||||
* @author vir@lindenlab.com
|
||||
*
|
||||
* $LicenseInfo:firstyear=2014&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2014, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
#ifndef LL_LLFLOATERHOVERHEIGHT_H
|
||||
#define LL_LLFLOATERHOVERHEIGHT_H
|
||||
|
||||
#include "llfloater.h"
|
||||
|
||||
class LLFloaterHoverHeight: public LLFloater
|
||||
{
|
||||
public:
|
||||
LLFloaterHoverHeight(const LLSD& key);
|
||||
BOOL postBuild();
|
||||
|
||||
static void onSliderMoved(LLUICtrl* ctrl, void* userData);
|
||||
|
||||
void onFinalCommit();
|
||||
|
||||
static void syncFromPreferenceSetting(void *user_data);
|
||||
|
||||
void onRegionChanged();
|
||||
void onSimulatorFeaturesReceived(const LLUUID ®ion_id);
|
||||
void updateEditEnabled();
|
||||
|
||||
/*virtual*/ void onClose(bool app_quitting);
|
||||
boost::signals2::connection mRegionChangedSlot;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -35,6 +35,8 @@
|
|||
#include "llagent.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llsdserialize.h"
|
||||
#include "llvoavatar.h"
|
||||
|
||||
LLFloaterPerms::LLFloaterPerms(const LLSD& seed)
|
||||
: LLFloater(seed)
|
||||
|
|
@ -171,8 +173,9 @@ public:
|
|||
private:
|
||||
static std::string sPreviousReason;
|
||||
|
||||
void error(U32 status, const std::string& reason)
|
||||
void httpFailure()
|
||||
{
|
||||
const std::string& reason = getReason();
|
||||
// Do not display the same error more than once in a row
|
||||
if (reason != sPreviousReason)
|
||||
{
|
||||
|
|
@ -182,8 +185,12 @@ private:
|
|||
LLNotificationsUtil::add("DefaultObjectPermissions", args);
|
||||
}
|
||||
}
|
||||
void result(const LLSD& content)
|
||||
|
||||
void httpSuccess()
|
||||
{
|
||||
//const LLSD& content = getContent();
|
||||
//dump_sequential_xml("perms_responder_result.xml", content);
|
||||
|
||||
// Since we have had a successful POST call be sure to display the next error message
|
||||
// even if it is the same as a previous one.
|
||||
sPreviousReason = "";
|
||||
|
|
|
|||
|
|
@ -2210,6 +2210,8 @@ bool idle_startup()
|
|||
llassert(LLPathfindingManager::getInstance() != NULL);
|
||||
LLPathfindingManager::getInstance()->initSystem();
|
||||
|
||||
gAgentAvatarp->sendHoverHeight();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -70,6 +70,7 @@
|
|||
#include "llfloatergroups.h"
|
||||
#include "llfloaterhardwaresettings.h"
|
||||
#include "llfloaterhelpbrowser.h"
|
||||
#include "llfloaterhoverheight.h"
|
||||
#include "llfloaterhud.h"
|
||||
#include "llfloaterimagepreview.h"
|
||||
#include "llfloaterimsession.h"
|
||||
|
|
@ -221,7 +222,8 @@ void LLViewerFloaterReg::registerFloaters()
|
|||
LLFloaterReg::add("god_tools", "floater_god_tools.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGodTools>);
|
||||
LLFloaterReg::add("group_picker", "floater_choose_group.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGroupPicker>);
|
||||
|
||||
LLFloaterReg::add("help_browser", "floater_help_browser.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHelpBrowser>);
|
||||
LLFloaterReg::add("help_browser", "floater_help_browser.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHelpBrowser>);
|
||||
LLFloaterReg::add("edit_hover_height", "floater_edit_hover_height.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHoverHeight>);
|
||||
LLFloaterReg::add("hud", "floater_hud.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHUD>);
|
||||
|
||||
LLFloaterReg::add("impanel", "floater_im_session.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterIMSession>);
|
||||
|
|
|
|||
|
|
@ -3881,6 +3881,14 @@ class LLEnableEditShape : public view_listener_t
|
|||
}
|
||||
};
|
||||
|
||||
class LLEnableHoverHeight : public view_listener_t
|
||||
{
|
||||
bool handleEvent(const LLSD& userdata)
|
||||
{
|
||||
return gAgent.getRegion() && gAgent.getRegion()->avatarHoverHeightEnabled();
|
||||
}
|
||||
};
|
||||
|
||||
class LLEnableEditPhysics : public view_listener_t
|
||||
{
|
||||
bool handleEvent(const LLSD& userdata)
|
||||
|
|
@ -6075,6 +6083,11 @@ void handle_edit_shape()
|
|||
LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_shape"));
|
||||
}
|
||||
|
||||
void handle_hover_height()
|
||||
{
|
||||
LLFloaterReg::showInstance("edit_hover_height");
|
||||
}
|
||||
|
||||
void handle_edit_physics()
|
||||
{
|
||||
LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_physics"));
|
||||
|
|
@ -8567,10 +8580,12 @@ void initialize_menus()
|
|||
view_listener_t::addMenu(new LLEditEnableTakeOff(), "Edit.EnableTakeOff");
|
||||
view_listener_t::addMenu(new LLEditEnableCustomizeAvatar(), "Edit.EnableCustomizeAvatar");
|
||||
view_listener_t::addMenu(new LLEnableEditShape(), "Edit.EnableEditShape");
|
||||
view_listener_t::addMenu(new LLEnableHoverHeight(), "Edit.EnableHoverHeight");
|
||||
view_listener_t::addMenu(new LLEnableEditPhysics(), "Edit.EnableEditPhysics");
|
||||
commit.add("CustomizeAvatar", boost::bind(&handle_customize_avatar));
|
||||
commit.add("EditOutfit", boost::bind(&handle_edit_outfit));
|
||||
commit.add("EditShape", boost::bind(&handle_edit_shape));
|
||||
commit.add("HoverHeight", boost::bind(&handle_hover_height));
|
||||
commit.add("EditPhysics", boost::bind(&handle_edit_physics));
|
||||
|
||||
// View menu
|
||||
|
|
|
|||
|
|
@ -423,6 +423,7 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
|
|||
mCacheDirty(FALSE),
|
||||
mReleaseNotesRequested(FALSE),
|
||||
mCapabilitiesReceived(false),
|
||||
mSimulatorFeaturesReceived(false),
|
||||
mBitsReceived(0.f),
|
||||
mPacketsReceived(0.f),
|
||||
mDead(FALSE),
|
||||
|
|
@ -2036,6 +2037,26 @@ void LLViewerRegion::getInfo(LLSD& info)
|
|||
info["Region"]["Handle"]["y"] = (LLSD::Integer)y;
|
||||
}
|
||||
|
||||
boost::signals2::connection LLViewerRegion::setSimulatorFeaturesReceivedCallback(const caps_received_signal_t::slot_type& cb)
|
||||
{
|
||||
return mSimulatorFeaturesReceivedSignal.connect(cb);
|
||||
}
|
||||
|
||||
void LLViewerRegion::setSimulatorFeaturesReceived(bool received)
|
||||
{
|
||||
mSimulatorFeaturesReceived = received;
|
||||
if (received)
|
||||
{
|
||||
mSimulatorFeaturesReceivedSignal(getRegionID());
|
||||
mSimulatorFeaturesReceivedSignal.disconnect_all_slots();
|
||||
}
|
||||
}
|
||||
|
||||
bool LLViewerRegion::simulatorFeaturesReceived() const
|
||||
{
|
||||
return mSimulatorFeaturesReceived;
|
||||
}
|
||||
|
||||
void LLViewerRegion::getSimulatorFeatures(LLSD& sim_features) const
|
||||
{
|
||||
sim_features = mSimulatorFeatures;
|
||||
|
|
@ -2049,6 +2070,9 @@ void LLViewerRegion::setSimulatorFeatures(const LLSD& sim_features)
|
|||
LLSDSerialize::toPrettyXML(sim_features, str);
|
||||
LL_INFOS() << str.str() << LL_ENDL;
|
||||
mSimulatorFeatures = sim_features;
|
||||
|
||||
setSimulatorFeaturesReceived(true);
|
||||
|
||||
}
|
||||
|
||||
//this is called when the parent is not cacheable.
|
||||
|
|
@ -3097,6 +3121,12 @@ bool LLViewerRegion::dynamicPathfindingEnabled() const
|
|||
return ( mSimulatorFeatures.has("DynamicPathfindingEnabled") &&
|
||||
mSimulatorFeatures["DynamicPathfindingEnabled"].asBoolean());
|
||||
}
|
||||
|
||||
bool LLViewerRegion::avatarHoverHeightEnabled() const
|
||||
{
|
||||
return ( mSimulatorFeatures.has("AvatarHoverHeightEnabled") &&
|
||||
mSimulatorFeatures["AvatarHoverHeightEnabled"].asBoolean());
|
||||
}
|
||||
/* Static Functions */
|
||||
|
||||
void log_capabilities(const CapabilityMap &capmap)
|
||||
|
|
|
|||
|
|
@ -309,12 +309,19 @@ public:
|
|||
bool meshRezEnabled() const;
|
||||
bool meshUploadEnabled() const;
|
||||
|
||||
// has region received its simulator features list? Requires an additional query after caps received.
|
||||
void setSimulatorFeaturesReceived(bool);
|
||||
bool simulatorFeaturesReceived() const;
|
||||
boost::signals2::connection setSimulatorFeaturesReceivedCallback(const caps_received_signal_t::slot_type& cb);
|
||||
|
||||
void getSimulatorFeatures(LLSD& info) const;
|
||||
void setSimulatorFeatures(const LLSD& info);
|
||||
|
||||
|
||||
bool dynamicPathfindingEnabled() const;
|
||||
|
||||
bool avatarHoverHeightEnabled() const;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
CACHE_MISS_TYPE_FULL = 0,
|
||||
|
|
@ -512,6 +519,7 @@ private:
|
|||
BOOL mCacheDirty;
|
||||
BOOL mAlive; // can become false if circuit disconnects
|
||||
BOOL mCapabilitiesReceived;
|
||||
BOOL mSimulatorFeaturesReceived;
|
||||
BOOL mReleaseNotesRequested;
|
||||
BOOL mDead; //if true, this region is in the process of deleting.
|
||||
BOOL mPaused; //pause processing the objects in the region
|
||||
|
|
@ -532,11 +540,13 @@ private:
|
|||
CacheMissItem::cache_miss_list_t mCacheMissList;
|
||||
|
||||
caps_received_signal_t mCapabilitiesReceivedSignal;
|
||||
caps_received_signal_t mSimulatorFeaturesReceivedSignal;
|
||||
|
||||
LLSD mSimulatorFeatures;
|
||||
|
||||
// the materials capability throttle
|
||||
LLFrameTimer mMaterialsCapThrottleTimer;
|
||||
LLFrameTimer mRenderInfoRequestTimer;
|
||||
LLFrameTimer mRenderInfoRequestTimer;
|
||||
};
|
||||
|
||||
inline BOOL LLViewerRegion::getRegionProtocol(U64 protocol) const
|
||||
|
|
|
|||
|
|
@ -111,6 +111,9 @@ extern F32 ANIM_SPEED_MAX;
|
|||
extern F32 ANIM_SPEED_MIN;
|
||||
extern U32 JOINT_COUNT_REQUIRED_FOR_FULLRIG;
|
||||
|
||||
const F32 MAX_HOVER_Z = 2.0;
|
||||
const F32 MIN_HOVER_Z = -2.0;
|
||||
|
||||
// #define OUTPUT_BREAST_DATA
|
||||
|
||||
using namespace LLAvatarAppearanceDefines;
|
||||
|
|
@ -241,6 +244,8 @@ struct LLAppearanceMessageContents
|
|||
//U32 appearance_flags = 0;
|
||||
std::vector<F32> mParamWeights;
|
||||
std::vector<LLVisualParam*> mParams;
|
||||
LLVector3 mHoverOffset;
|
||||
bool mHoverOffsetWasSet;
|
||||
};
|
||||
|
||||
struct LLVOAvatarChildJoint : public LLInitParam::ChoiceBlock<LLVOAvatarChildJoint>
|
||||
|
|
@ -708,7 +713,8 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
|
|||
mLastUpdateReceivedCOFVersion(-1)
|
||||
{
|
||||
//VTResume(); // VTune
|
||||
|
||||
setHoverOffset(LLVector3(0.0, 0.0, 0.0));
|
||||
|
||||
// mVoiceVisualizer is created by the hud effects manager and uses the HUD Effects pipeline
|
||||
const BOOL needsSendToSim = false; // currently, this HUD effect doesn't need to pack and unpack data to do its job
|
||||
mVoiceVisualizer = ( LLVoiceVisualizer *)LLHUDManager::getInstance()->createViewerEffect( LLHUDObject::LL_HUD_EFFECT_VOICE_VISUALIZER, needsSendToSim );
|
||||
|
|
@ -761,6 +767,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
|
|||
mRuthTimer.reset();
|
||||
mRuthDebugTimer.reset();
|
||||
mDebugExistenceTimer.reset();
|
||||
mLastAppearanceMessageTimer.reset();
|
||||
|
||||
if(LLSceneMonitor::getInstance()->isEnabled())
|
||||
{
|
||||
|
|
@ -1944,6 +1951,11 @@ U32 LLVOAvatar::processUpdateMessage(LLMessageSystem *mesgsys,
|
|||
// Do base class updates...
|
||||
U32 retval = LLViewerObject::processUpdateMessage(mesgsys, user_data, block_num, update_type, dp);
|
||||
|
||||
//LLTEContents tec;
|
||||
//S32 te_retval = parseTEMessage(mesgsys, _PREHASH_ObjectData, block_num, tec);
|
||||
|
||||
LL_DEBUGS("Avatar") << avString() << update_type << LL_ENDL;
|
||||
|
||||
// Print out arrival information once we have name of avatar.
|
||||
if (has_name && getNVPair("FirstName"))
|
||||
{
|
||||
|
|
@ -3155,12 +3167,8 @@ void LLVOAvatar::forceUpdateVisualMuteSettings()
|
|||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// updateCharacter()
|
||||
// called on both your avatar and other avatars
|
||||
//------------------------------------------------------------------------
|
||||
BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
|
||||
{
|
||||
void LLVOAvatar::updateDebugText()
|
||||
{
|
||||
// clear debug text
|
||||
mDebugText.clear();
|
||||
|
||||
|
|
@ -3197,6 +3205,22 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
|
|||
debug_line += llformat(" - cof rcv:%d", last_received_cof_version);
|
||||
}
|
||||
debug_line += llformat(" bsz-z: %f avofs-z: %f", mBodySize[2], mAvatarOffset[2]);
|
||||
bool hover_enabled = getRegion() && getRegion()->avatarHoverHeightEnabled();
|
||||
debug_line += hover_enabled ? " H" : " h";
|
||||
const LLVector3& hover_offset = getHoverOffset();
|
||||
if (hover_offset[2] != 0.0)
|
||||
{
|
||||
debug_line += llformat(" hov_z: %f", hover_offset[2]);
|
||||
debug_line += llformat(" %s", (mIsSitting ? "S" : "T"));
|
||||
debug_line += llformat("%s", (isMotionActive(ANIM_AGENT_SIT_GROUND_CONSTRAINED) ? "G" : "-"));
|
||||
}
|
||||
F32 elapsed = mLastAppearanceMessageTimer.getElapsedTimeF32();
|
||||
static const char *elapsed_chars = "Xx*...";
|
||||
U32 bucket = U32(elapsed*2);
|
||||
if (bucket < strlen(elapsed_chars))
|
||||
{
|
||||
debug_line += llformat(" %c", elapsed_chars[bucket]);
|
||||
}
|
||||
addDebugText(debug_line);
|
||||
}
|
||||
if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked"))
|
||||
|
|
@ -3204,7 +3228,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
|
|||
if (!mBakedTextureDebugText.empty())
|
||||
addDebugText(mBakedTextureDebugText);
|
||||
}
|
||||
|
||||
|
||||
if (LLVOAvatar::sShowAnimationDebug)
|
||||
{
|
||||
for (LLMotionController::motion_list_t::iterator iter = mMotionController.getActiveMotions().begin();
|
||||
|
|
@ -3233,6 +3257,27 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
|
|||
}
|
||||
}
|
||||
|
||||
if (!mDebugText.size() && mText.notNull())
|
||||
{
|
||||
mText->markDead();
|
||||
mText = NULL;
|
||||
}
|
||||
else if (mDebugText.size())
|
||||
{
|
||||
setDebugText(mDebugText);
|
||||
}
|
||||
mDebugText.clear();
|
||||
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// updateCharacter()
|
||||
// called on both your avatar and other avatars
|
||||
//------------------------------------------------------------------------
|
||||
BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
|
||||
{
|
||||
updateDebugText();
|
||||
|
||||
if (!mIsBuilt)
|
||||
{
|
||||
return FALSE;
|
||||
|
|
@ -3341,9 +3386,15 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
|
|||
LLVector3 xyVel = getVelocity();
|
||||
xyVel.mV[VZ] = 0.0f;
|
||||
speed = xyVel.length();
|
||||
|
||||
// remembering the value here prevents a display glitch if the
|
||||
// animation gets toggled during this update.
|
||||
bool was_sit_ground_constrained = isMotionActive(ANIM_AGENT_SIT_GROUND_CONSTRAINED);
|
||||
|
||||
if (!(mIsSitting && getParent()))
|
||||
{
|
||||
// This case includes all configurations except sitting on an
|
||||
// object, so does include ground sit.
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// get timing info
|
||||
// handle initial condition case
|
||||
|
|
@ -3397,9 +3448,14 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
|
|||
// correct for the fact that the pelvis is not necessarily the center
|
||||
// of the agent's physical representation
|
||||
root_pos.mdV[VZ] -= (0.5f * mBodySize.mV[VZ]) - mPelvisToFoot;
|
||||
if (!mIsSitting && !was_sit_ground_constrained)
|
||||
{
|
||||
root_pos += LLVector3d(getHoverOffset());
|
||||
}
|
||||
|
||||
LLVector3 newPosition = gAgent.getPosAgentFromGlobal(root_pos);
|
||||
|
||||
|
||||
if (newPosition != mRoot->getXform()->getWorldPosition())
|
||||
{
|
||||
mRoot->touch();
|
||||
|
|
@ -3564,7 +3620,9 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
|
|||
}
|
||||
else if (mDrawable.notNull())
|
||||
{
|
||||
mRoot->setPosition(mDrawable->getPosition());
|
||||
LLVector3 pos = mDrawable->getPosition();
|
||||
pos += getHoverOffset() * mDrawable->getRotation();
|
||||
mRoot->setPosition(pos);
|
||||
mRoot->setRotation(mDrawable->getRotation());
|
||||
}
|
||||
|
||||
|
|
@ -3583,7 +3641,21 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
|
|||
{
|
||||
updateMotions(LLCharacter::NORMAL_UPDATE);
|
||||
}
|
||||
|
||||
|
||||
// Special handling for sitting on ground.
|
||||
if (!getParent() && (mIsSitting || was_sit_ground_constrained))
|
||||
{
|
||||
|
||||
F32 off_z = LLVector3d(getHoverOffset()).mdV[VZ];
|
||||
if (off_z != 0.0)
|
||||
{
|
||||
LLVector3 pos = mRoot->getWorldPosition();
|
||||
pos.mV[VZ] += off_z;
|
||||
mRoot->touch();
|
||||
mRoot->setWorldPosition(pos);
|
||||
}
|
||||
}
|
||||
|
||||
// update head position
|
||||
updateHeadOffset();
|
||||
|
||||
|
|
@ -3667,17 +3739,6 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
|
|||
|
||||
mRoot->updateWorldMatrixChildren();
|
||||
|
||||
if (!mDebugText.size() && mText.notNull())
|
||||
{
|
||||
mText->markDead();
|
||||
mText = NULL;
|
||||
}
|
||||
else if (mDebugText.size())
|
||||
{
|
||||
setDebugText(mDebugText);
|
||||
}
|
||||
mDebugText.clear();
|
||||
|
||||
//mesh vertices need to be reskinned
|
||||
mNeedsSkin = TRUE;
|
||||
return TRUE;
|
||||
|
|
@ -7115,6 +7176,17 @@ void LLVOAvatar::parseAppearanceMessage(LLMessageSystem* mesgsys, LLAppearanceMe
|
|||
// For future use:
|
||||
//mesgsys->getU32Fast(_PREHASH_AppearanceData, _PREHASH_Flags, appearance_flags, 0);
|
||||
}
|
||||
|
||||
// Parse the AppearanceData field, if any.
|
||||
contents.mHoverOffsetWasSet = false;
|
||||
if (mesgsys->has(_PREHASH_AppearanceHover))
|
||||
{
|
||||
LLVector3 hover;
|
||||
mesgsys->getVector3Fast(_PREHASH_AppearanceHover, _PREHASH_HoverHeight, hover);
|
||||
LL_DEBUGS("Avatar") << avString() << " hover received " << hover.mV[ VX ] << "," << hover.mV[ VY ] << "," << hover.mV[ VZ ] << LL_ENDL;
|
||||
contents.mHoverOffset = hover;
|
||||
contents.mHoverOffsetWasSet = true;
|
||||
}
|
||||
|
||||
// Parse visual params, if any.
|
||||
S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_VisualParam);
|
||||
|
|
@ -7232,6 +7304,8 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
|
|||
return;
|
||||
}
|
||||
|
||||
mLastAppearanceMessageTimer.reset();
|
||||
|
||||
ESex old_sex = getSex();
|
||||
|
||||
LLAppearanceMessageContents contents;
|
||||
|
|
@ -7416,6 +7490,22 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
|
|||
}
|
||||
}
|
||||
|
||||
if (contents.mHoverOffsetWasSet && !isSelf())
|
||||
{
|
||||
// Got an update for some other avatar
|
||||
// Ignore updates for self, because we have a more authoritative value in the preferences.
|
||||
setHoverOffset(contents.mHoverOffset);
|
||||
LL_INFOS("Avatar") << avString() << "setting hover from message" << contents.mHoverOffset[2] << LL_ENDL;
|
||||
}
|
||||
|
||||
if (!contents.mHoverOffsetWasSet && !isSelf())
|
||||
{
|
||||
// If we don't get a value at all, we are presumably in a
|
||||
// region that does not support hover height.
|
||||
LL_WARNS() << avString() << "zeroing hover because not defined in appearance message" << LL_ENDL;
|
||||
setHoverOffset(LLVector3(0.0, 0.0, 0.0));
|
||||
}
|
||||
|
||||
setCompositeUpdatesEnabled( TRUE );
|
||||
|
||||
// If all of the avatars are completely baked, release the global image caches to conserve memory.
|
||||
|
|
|
|||
|
|
@ -214,7 +214,6 @@ public:
|
|||
/*virtual*/ LLVector3 getPosAgentFromGlobal(const LLVector3d &position);
|
||||
virtual void updateVisualParams();
|
||||
|
||||
|
||||
/** Inherited
|
||||
** **
|
||||
*******************************************************************************/
|
||||
|
|
@ -234,6 +233,7 @@ private: //aligned members
|
|||
// Updates
|
||||
//--------------------------------------------------------------------
|
||||
public:
|
||||
void updateDebugText();
|
||||
virtual BOOL updateCharacter(LLAgent &agent);
|
||||
void idleUpdateVoiceVisualizer(bool voice_enabled);
|
||||
void idleUpdateMisc(bool detailed_update);
|
||||
|
|
@ -988,6 +988,7 @@ public:
|
|||
protected:
|
||||
LLFrameTimer mRuthDebugTimer; // For tracking how long it takes for av to rez
|
||||
LLFrameTimer mDebugExistenceTimer; // Debugging for how long the avatar has been in memory.
|
||||
LLFrameTimer mLastAppearanceMessageTimer; // Time since last appearance message received.
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// COF monitoring
|
||||
|
|
@ -1020,6 +1021,9 @@ protected: // Shared with LLVOAvatarSelf
|
|||
extern const F32 SELF_ADDITIONAL_PRI;
|
||||
extern const S32 MAX_TEXTURE_VIRTUAL_SIZE_RESET_INTERVAL;
|
||||
|
||||
extern const F32 MAX_HOVER_Z;
|
||||
extern const F32 MIN_HOVER_Z;
|
||||
|
||||
std::string get_sequential_numbered_file_name(const std::string& prefix,
|
||||
const std::string& suffix);
|
||||
void dump_sequential_xml(const std::string outprefix, const LLSD& content);
|
||||
|
|
|
|||
|
|
@ -127,6 +127,25 @@ struct LocalTextureData
|
|||
LLTextureEntry *mTexEntry;
|
||||
};
|
||||
|
||||
// TODO - this class doesn't really do anything, could just use a base
|
||||
// class responder if nothing else gets added.
|
||||
class LLHoverHeightResponder: public LLHTTPClient::Responder
|
||||
{
|
||||
public:
|
||||
LLHoverHeightResponder(): LLHTTPClient::Responder() {}
|
||||
|
||||
private:
|
||||
void httpFailure()
|
||||
{
|
||||
LL_WARNS() << dumpResponse() << LL_ENDL;
|
||||
}
|
||||
|
||||
void httpSuccess()
|
||||
{
|
||||
LL_INFOS() << dumpResponse() << LL_ENDL;
|
||||
}
|
||||
};
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Callback data
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
@ -158,7 +177,10 @@ LLVOAvatarSelf::LLVOAvatarSelf(const LLUUID& id,
|
|||
LLVOAvatar(id, pcode, regionp),
|
||||
mScreenp(NULL),
|
||||
mLastRegionHandle(0),
|
||||
mRegionCrossingCount(0)
|
||||
mRegionCrossingCount(0),
|
||||
// Value outside legal range, so will always be a mismatch the
|
||||
// first time through.
|
||||
mLastHoverOffsetSent(LLVector3(0.0f, 0.0f, -999.0f))
|
||||
{
|
||||
mMotionController.mIsSelf = TRUE;
|
||||
|
||||
|
|
@ -219,11 +241,40 @@ void LLVOAvatarSelf::initInstance()
|
|||
return;
|
||||
}
|
||||
|
||||
setHoverIfRegionEnabled();
|
||||
|
||||
//doPeriodically(output_self_av_texture_diagnostics, 30.0);
|
||||
doPeriodically(update_avatar_rez_metrics, 5.0);
|
||||
doPeriodically(boost::bind(&LLVOAvatarSelf::checkStuckAppearance, this), 30.0);
|
||||
}
|
||||
|
||||
void LLVOAvatarSelf::setHoverIfRegionEnabled()
|
||||
{
|
||||
if (getRegion() && getRegion()->simulatorFeaturesReceived())
|
||||
{
|
||||
if (getRegion()->avatarHoverHeightEnabled())
|
||||
{
|
||||
F32 hover_z = gSavedPerAccountSettings.getF32("AvatarHoverOffsetZ");
|
||||
setHoverOffset(LLVector3(0.0, 0.0, llclamp(hover_z,MIN_HOVER_Z,MAX_HOVER_Z)));
|
||||
LL_INFOS("Avatar") << avString() << " set hover height from debug setting " << hover_z << LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
setHoverOffset(LLVector3(0.0, 0.0, 0.0));
|
||||
LL_INFOS("Avatar") << avString() << " zeroing hover height, region does not support" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_INFOS("Avatar") << avString() << " region or simulator features not known, no change on hover" << LL_ENDL;
|
||||
if (getRegion())
|
||||
{
|
||||
getRegion()->setSimulatorFeaturesReceivedCallback(boost::bind(&LLVOAvatarSelf::onSimulatorFeaturesReceived,this,_1));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
bool LLVOAvatarSelf::checkStuckAppearance()
|
||||
{
|
||||
const F32 CONDITIONAL_UNSTICK_INTERVAL = 300.0;
|
||||
|
|
@ -834,6 +885,12 @@ void LLVOAvatarSelf::removeMissingBakedTextures()
|
|||
}
|
||||
}
|
||||
|
||||
void LLVOAvatarSelf::onSimulatorFeaturesReceived(const LLUUID& region_id)
|
||||
{
|
||||
LL_INFOS("Avatar") << "simulator features received, setting hover based on region props" << LL_ENDL;
|
||||
setHoverIfRegionEnabled();
|
||||
}
|
||||
|
||||
//virtual
|
||||
void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp)
|
||||
{
|
||||
|
|
@ -852,6 +909,17 @@ void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp)
|
|||
//LL_INFOS() << "pos_from_old_region is " << global_pos_from_old_region
|
||||
// << " while pos_from_new_region is " << pos_from_new_region
|
||||
// << LL_ENDL;
|
||||
|
||||
// Update hover height, or schedule callback, based on whether
|
||||
// it's supported in this region.
|
||||
if (regionp->simulatorFeaturesReceived())
|
||||
{
|
||||
setHoverIfRegionEnabled();
|
||||
}
|
||||
else
|
||||
{
|
||||
regionp->setSimulatorFeaturesReceivedCallback(boost::bind(&LLVOAvatarSelf::onSimulatorFeaturesReceived,this,_1));
|
||||
}
|
||||
}
|
||||
|
||||
if (!regionp || (regionp->getHandle() != mLastRegionHandle))
|
||||
|
|
@ -2707,6 +2775,39 @@ bool LLVOAvatarSelf::sendAppearanceMessage(LLMessageSystem *mesgsys) const
|
|||
return success;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// sendHoverHeight()
|
||||
//------------------------------------------------------------------------
|
||||
void LLVOAvatarSelf::sendHoverHeight() const
|
||||
{
|
||||
std::string url = gAgent.getRegion()->getCapability("AgentPreferences");
|
||||
|
||||
if (!url.empty())
|
||||
{
|
||||
LLSD update = LLSD::emptyMap();
|
||||
const LLVector3& hover_offset = getHoverOffset();
|
||||
update["hover_height"] = hover_offset[2];
|
||||
|
||||
LL_DEBUGS("Avatar") << avString() << "sending hover height value " << hover_offset[2] << LL_ENDL;
|
||||
LLHTTPClient::post(url, update, new LLHoverHeightResponder);
|
||||
|
||||
mLastHoverOffsetSent = hover_offset;
|
||||
}
|
||||
}
|
||||
|
||||
void LLVOAvatarSelf::setHoverOffset(const LLVector3& hover_offset, bool send_update)
|
||||
{
|
||||
if (getHoverOffset() != hover_offset)
|
||||
{
|
||||
LL_INFOS("Avatar") << avString() << " setting hover due to change " << hover_offset[2] << LL_ENDL;
|
||||
LLVOAvatar::setHoverOffset(hover_offset, send_update);
|
||||
}
|
||||
if (send_update && (hover_offset != mLastHoverOffsetSent))
|
||||
{
|
||||
LL_INFOS("Avatar") << avString() << " sending hover due to change " << hover_offset[2] << LL_ENDL;
|
||||
sendHoverHeight();
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// needsRenderBeam()
|
||||
|
|
|
|||
|
|
@ -75,6 +75,9 @@ protected:
|
|||
// LLViewerObject interface and related
|
||||
//--------------------------------------------------------------------
|
||||
public:
|
||||
boost::signals2::connection mRegionChangedSlot;
|
||||
|
||||
void onSimulatorFeaturesReceived(const LLUUID& region_id);
|
||||
/*virtual*/ void updateRegion(LLViewerRegion *regionp);
|
||||
/*virtual*/ void idleUpdate(LLAgent &agent, const F64 &time);
|
||||
|
||||
|
|
@ -327,6 +330,14 @@ public:
|
|||
public:
|
||||
bool sendAppearanceMessage(LLMessageSystem *mesgsys) const;
|
||||
|
||||
// -- care and feeding of hover height.
|
||||
void setHoverIfRegionEnabled();
|
||||
void sendHoverHeight() const;
|
||||
/*virtual*/ void setHoverOffset(const LLVector3& hover_offset, bool send_update=true);
|
||||
|
||||
private:
|
||||
mutable LLVector3 mLastHoverOffsetSent;
|
||||
|
||||
/** Appearance
|
||||
** **
|
||||
*******************************************************************************/
|
||||
|
|
|
|||
|
|
@ -0,0 +1,38 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater
|
||||
positioning="cascading"
|
||||
ignore_ui_scale="false"
|
||||
legacy_header_height="225"
|
||||
can_minimize="true"
|
||||
can_close="true"
|
||||
can_resize="true"
|
||||
min_height="65"
|
||||
min_width="515"
|
||||
height="65"
|
||||
layout="topleft"
|
||||
name="HoverHeight"
|
||||
single_instance="true"
|
||||
help_topic="hover_height"
|
||||
save_rect="true"
|
||||
save_visibility="true"
|
||||
title="SET HOVER HEIGHT"
|
||||
width="515">
|
||||
<slider
|
||||
enabled="false"
|
||||
control_name="HoverHeightSlider"
|
||||
decimal_digits="3"
|
||||
follows="top|left"
|
||||
height="15"
|
||||
increment="0.001"
|
||||
initial_value="0.0"
|
||||
label="Height"
|
||||
label_width="60"
|
||||
left="10"
|
||||
width="501"
|
||||
layout="topleft"
|
||||
name="HoverHeightSlider"
|
||||
top="35"
|
||||
can_edit_text="true"
|
||||
>
|
||||
</slider>
|
||||
</floater>
|
||||
|
|
@ -91,6 +91,14 @@ name="Edit Outfit">
|
|||
<menu_item_call.on_enable
|
||||
function="Edit.EnableEditShape" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Hover Height"
|
||||
layout="topleft"
|
||||
name="Hover Height">
|
||||
<menu_item_call.on_click
|
||||
function="HoverHeight" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableHoverHeight" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="My Friends"
|
||||
layout="topleft"
|
||||
|
|
|
|||
|
|
@ -229,6 +229,14 @@
|
|||
<menu_item_call.on_enable
|
||||
function="Edit.EnableEditShape" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Hover Height"
|
||||
layout="topleft"
|
||||
name="Hover Height">
|
||||
<menu_item_call.on_click
|
||||
function="HoverHeight" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableHoverHeight" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="My Friends"
|
||||
layout="topleft"
|
||||
|
|
|
|||
|
|
@ -3594,6 +3594,10 @@ version 2.0
|
|||
{ CofVersion S32 }
|
||||
{ Flags U32 }
|
||||
}
|
||||
{
|
||||
AppearanceHover Variable
|
||||
{ HoverHeight LLVector3 }
|
||||
}
|
||||
}
|
||||
|
||||
// AvatarSitResponse - response to a request to sit on an object
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
4dbf88396c3188ad4c54c4f847a7d8817793668d
|
||||
2286adc795b1b06eb86fdda431a71a6f0874b4f1
|
||||
Loading…
Reference in New Issue