Merge viewer-bear

master
Ansariel 2017-02-03 20:09:53 +01:00
commit e8d4094d90
30 changed files with 664 additions and 116 deletions

View File

@ -3767,10 +3767,46 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
continue;
}
if (face.mTypeMask & (LLVolumeFace::CAP_MASK)) {
if (face.mTypeMask & (LLVolumeFace::CAP_MASK))
{
LLVector4a* v = (LLVector4a*)face.mPositions;
LLVector4a* n = (LLVector4a*)face.mNormals;
for (U32 j = 0; j < face.mNumIndices / 3; j++)
{
for (S32 k = 0; k < 3; k++)
{
S32 index = face.mEdge[j * 3 + k];
if (index == -1)
{
// silhouette edge, currently only cubes, so no other conditions
S32 v1 = face.mIndices[j * 3 + k];
S32 v2 = face.mIndices[j * 3 + ((k + 1) % 3)];
LLVector4a t;
mat.affineTransform(v[v1], t);
vertices.push_back(LLVector3(t[0], t[1], t[2]));
norm_mat.rotate(n[v1], t);
t.normalize3fast();
normals.push_back(LLVector3(t[0], t[1], t[2]));
mat.affineTransform(v[v2], t);
vertices.push_back(LLVector3(t[0], t[1], t[2]));
norm_mat.rotate(n[v2], t);
t.normalize3fast();
normals.push_back(LLVector3(t[0], t[1], t[2]));
}
}
}
}
else {
else
{
//==============================================
//DEBUG draw edge map instead of silhouette edge
@ -5629,10 +5665,17 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
if (!partial_build)
{
resizeIndices(grid_size*grid_size*6);
if (!volume->isMeshAssetLoaded())
{
mEdge.resize(grid_size*grid_size * 6);
}
U16* out = mIndices;
S32 idxs[] = {0,1,(grid_size+1)+1,(grid_size+1)+1,(grid_size+1),0};
int cur_edge = 0;
for(S32 gx = 0;gx<grid_size;gx++)
{
@ -5643,7 +5686,49 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
for(S32 i=5;i>=0;i--)
{
*out++ = ((gy*(grid_size+1))+gx+idxs[i]);
}
}
S32 edge_value = grid_size * 2 * gy + gx * 2;
if (gx > 0)
{
mEdge[cur_edge++] = edge_value;
}
else
{
mEdge[cur_edge++] = -1; // Mark face to higlight it
}
if (gy < grid_size - 1)
{
mEdge[cur_edge++] = edge_value;
}
else
{
mEdge[cur_edge++] = -1;
}
mEdge[cur_edge++] = edge_value;
if (gx < grid_size - 1)
{
mEdge[cur_edge++] = edge_value;
}
else
{
mEdge[cur_edge++] = -1;
}
if (gy > 0)
{
mEdge[cur_edge++] = edge_value;
}
else
{
mEdge[cur_edge++] = -1;
}
mEdge[cur_edge++] = edge_value;
}
else
{
@ -5651,8 +5736,50 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
{
*out++ = ((gy*(grid_size+1))+gx+idxs[i]);
}
S32 edge_value = grid_size * 2 * gy + gx * 2;
if (gy > 0)
{
mEdge[cur_edge++] = edge_value;
}
else
{
mEdge[cur_edge++] = -1;
}
if (gx < grid_size - 1)
{
mEdge[cur_edge++] = edge_value;
}
else
{
mEdge[cur_edge++] = -1;
}
mEdge[cur_edge++] = edge_value;
if (gy < grid_size - 1)
{
mEdge[cur_edge++] = edge_value;
}
else
{
mEdge[cur_edge++] = -1;
}
if (gx > 0)
{
mEdge[cur_edge++] = edge_value;
}
else
{
mEdge[cur_edge++] = -1;
}
mEdge[cur_edge++] = edge_value;
}
}
}
}
}

View File

@ -610,6 +610,50 @@
<key>Value</key>
<integer>1</integer>
</map>
<key>ModelUploadFolder</key>
<map>
<key>Comment</key>
<string>All model uploads will be stored in this directory (UUID)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string></string>
</map>
<key>TextureUploadFolder</key>
<map>
<key>Comment</key>
<string>All image(texture) uploads will be stored in this directory (UUID)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string></string>
</map>
<key>SoundUploadFolder</key>
<map>
<key>Comment</key>
<string>All sound uploads will be stored in this directory (UUID)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string></string>
</map>
<key>AnimationUploadFolder</key>
<map>
<key>Comment</key>
<string>All animation uploads will be stored in this directory (UUID)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string></string>
</map>
<!-- Firestorm settings -->
<key>DebugLookAt</key>

View File

@ -67,6 +67,8 @@ public:
void sortByType();
void refresh();
U32 getMuteListSize() { return mMuteListSize; }
private:
void addNewItem(const LLMute* mute);

View File

@ -379,8 +379,13 @@ bool LLConversationLogList::isActionEnabled(const LLSD& userdata)
bool is_p2p = LLIMModel::LLIMSession::P2P_SESSION == stype;
bool is_group = LLIMModel::LLIMSession::GROUP_SESSION == stype;
bool is_group_member = is_group && gAgent.isInGroup(selected_id, TRUE);
if ("can_im" == command_name || "can_view_profile" == command_name)
if ("can_im" == command_name)
{
return is_p2p || is_group_member;
}
else if ("can_view_profile" == command_name)
{
return is_p2p || is_group;
}
@ -390,7 +395,7 @@ bool LLConversationLogList::isActionEnabled(const LLSD& userdata)
}
else if ("can_call" == command_name)
{
return (is_p2p || is_group) && LLAvatarActions::canCall();
return (is_p2p || is_group_member) && LLAvatarActions::canCall();
}
else if ("add_rem_friend" == command_name ||
"can_invite_to_group" == command_name ||

View File

@ -658,6 +658,11 @@ BOOL LLFloaterPreference::postBuild()
gSavedSettings.getControl("PreferredMaturity")->getSignal()->connect(boost::bind(&LLFloaterPreference::onChangeMaturity, this));
gSavedPerAccountSettings.getControl("ModelUploadFolder")->getSignal()->connect(boost::bind(&LLFloaterPreference::onChangeModelFolder, this));
gSavedPerAccountSettings.getControl("TextureUploadFolder")->getSignal()->connect(boost::bind(&LLFloaterPreference::onChangeTextureFolder, this));
gSavedPerAccountSettings.getControl("SoundUploadFolder")->getSignal()->connect(boost::bind(&LLFloaterPreference::onChangeSoundFolder, this));
gSavedPerAccountSettings.getControl("AnimationUploadFolder")->getSignal()->connect(boost::bind(&LLFloaterPreference::onChangeAnimationFolder, this));
LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab")))
tabcontainer->selectFirstTab();
@ -1149,7 +1154,12 @@ void LLFloaterPreference::onOpen(const LLSD& key)
// Display selected maturity icons.
onChangeMaturity();
onChangeModelFolder();
onChangeTextureFolder();
onChangeSoundFolder();
onChangeAnimationFolder();
// Load (double-)click to walk/teleport settings.
updateClickActionControls();
@ -3229,6 +3239,57 @@ void LLFloaterPreference::onChangeMaturity()
getChild<LLIconCtrl>("rating_icon_adult")->setVisible(sim_access == SIM_ACCESS_ADULT);
}
std::string get_category_path(LLUUID cat_id)
{
LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
if (cat->getParentUUID().notNull())
{
return get_category_path(cat->getParentUUID()) + " > " + cat->getName();
}
else
{
return cat->getName();
}
}
std::string get_category_path(LLFolderType::EType cat_type)
{
LLUUID cat_id = gInventory.findUserDefinedCategoryUUIDForType(cat_type);
return get_category_path(cat_id);
}
void LLFloaterPreference::onChangeModelFolder()
{
if (gInventory.isInventoryUsable())
{
getChild<LLTextBox>("upload_models")->setText(get_category_path(LLFolderType::FT_OBJECT));
}
}
void LLFloaterPreference::onChangeTextureFolder()
{
if (gInventory.isInventoryUsable())
{
getChild<LLTextBox>("upload_textures")->setText(get_category_path(LLFolderType::FT_TEXTURE));
}
}
void LLFloaterPreference::onChangeSoundFolder()
{
if (gInventory.isInventoryUsable())
{
getChild<LLTextBox>("upload_sounds")->setText(get_category_path(LLFolderType::FT_SOUND));
}
}
void LLFloaterPreference::onChangeAnimationFolder()
{
if (gInventory.isInventoryUsable())
{
getChild<LLTextBox>("upload_animation")->setText(get_category_path(LLFolderType::FT_ANIMATION));
}
}
// FIXME: this will stop you from spawning the sidetray from preferences dialog on login screen
// but the UI for this will still be enabled
void LLFloaterPreference::onClickBlockList()

View File

@ -242,6 +242,10 @@ public:
void onCommitMusicEnabled();
void applyResolution();
void onChangeMaturity();
void onChangeModelFolder();
void onChangeTextureFolder();
void onChangeSoundFolder();
void onChangeAnimationFolder();
void onClickBlockList();
void onClickProxySettings();
void onClickTranslationSettings();

View File

@ -90,6 +90,38 @@ BOOL LLFloaterScriptDebug::postBuild()
return FALSE;
}
// <FS:Ansariel> Improved script debug floater
//void LLFloaterScriptDebug::setVisible(BOOL visible)
//{
// if(visible)
// {
// LLFloaterScriptDebugOutput* floater_output = LLFloaterReg::findTypedInstance<LLFloaterScriptDebugOutput>("script_debug_output", LLUUID::null);
// if (floater_output == NULL)
// {
// floater_output = dynamic_cast<LLFloaterScriptDebugOutput*>(LLFloaterReg::showInstance("script_debug_output", LLUUID::null, FALSE));
// if (floater_output)
// {
// addFloater(floater_output, false);
// }
// }
// }
// LLMultiFloater::setVisible(visible);
//}
//void LLFloaterScriptDebug::closeFloater(bool app_quitting/* = false*/)
//{
// if(app_quitting)
// {
// LLMultiFloater::closeFloater(app_quitting);
// }
// else
// {
// setVisible(false);
// }
//}
// </FS:Ansariel>
// <FS:Ansariel> Script debug icon
//LLFloater* LLFloaterScriptDebug::addOutputWindow(const LLUUID &object_id)
LLFloater* LLFloaterScriptDebug::addOutputWindow(const LLUUID& object_id, bool show /* = false */)
@ -161,7 +193,7 @@ void LLFloaterScriptDebug::addScriptLine(const LLChat& chat)
floater_label = chat.mFromName;
}
addOutputWindow(LLUUID::null);
addOutputWindow(LLUUID::null); // <FS:Ansariel> Improved script debug floater
// <FS:Kadah> [FSllOwnerSayToScriptDebugWindow]
// addOutputWindow(source_id);
static LLCachedControl<U32> FSllOwnerSayRouting(gSavedSettings, "FSllOwnerSayToScriptDebugWindowRouting");

View File

@ -39,7 +39,10 @@ public:
LLFloaterScriptDebug(const LLSD& key);
virtual ~LLFloaterScriptDebug();
virtual BOOL postBuild();
//virtual void setVisible(BOOL visible); // <FS:Ansariel> Improved script debug floater
static void show(const LLUUID& object_id);
/*virtual*/ //void closeFloater(bool app_quitting = false); // <FS:Ansariel> Improved script debug floater
// <FS:Kadah> [FSllOwnerSayToScriptDebugWindow]
// static void addScriptLine(const std::string &utf8mesg, const std::string &user_name, const LLColor4& color, const LLUUID& source_id);
static void addScriptLine(const LLChat& chat);

View File

@ -4134,6 +4134,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
disabled_items.push_back(std::string("New Gesture"));
disabled_items.push_back(std::string("New Clothes"));
disabled_items.push_back(std::string("New Body Parts"));
disabled_items.push_back(std::string("upload_def"));
}
if (favorites == mUUID)
{
@ -4160,6 +4161,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
disabled_items.push_back(std::string("New Gesture"));
disabled_items.push_back(std::string("New Clothes"));
disabled_items.push_back(std::string("New Body Parts"));
disabled_items.push_back(std::string("upload_def"));
}
if (marketplace_listings_id == mUUID)
{
@ -4213,6 +4215,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
items.push_back(std::string("New Gesture"));
items.push_back(std::string("New Clothes"));
items.push_back(std::string("New Body Parts"));
items.push_back(std::string("upload_def"));
}
}
getClipboardEntries(false, items, disabled_items, flags);

View File

@ -539,6 +539,42 @@ const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType prefe
return findCategoryUUIDForTypeInRoot(preferred_type, create_folder, gInventory.getRootFolderID());
}
const LLUUID LLInventoryModel::findUserDefinedCategoryUUIDForType(LLFolderType::EType preferred_type)
{
LLUUID cat_id;
switch (preferred_type)
{
case LLFolderType::FT_OBJECT:
{
cat_id = LLUUID(gSavedPerAccountSettings.getString("ModelUploadFolder"));
break;
}
case LLFolderType::FT_TEXTURE:
{
cat_id = LLUUID(gSavedPerAccountSettings.getString("TextureUploadFolder"));
break;
}
case LLFolderType::FT_SOUND:
{
cat_id = LLUUID(gSavedPerAccountSettings.getString("SoundUploadFolder"));
break;
}
case LLFolderType::FT_ANIMATION:
{
cat_id = LLUUID(gSavedPerAccountSettings.getString("AnimationUploadFolder"));
break;
}
default:
break;
}
if (cat_id.isNull() || !getCategory(cat_id))
{
cat_id = findCategoryUUIDForTypeInRoot(preferred_type, true, getRootFolderID());
}
return cat_id;
}
const LLUUID LLInventoryModel::findLibraryCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder)
{
return findCategoryUUIDForTypeInRoot(preferred_type, create_folder, gInventory.getLibraryRootFolderID());

View File

@ -312,6 +312,9 @@ public:
// will search in the user's library folder instead of "My Inventory"
const LLUUID findLibraryCategoryUUIDForType(LLFolderType::EType preferred_type,
bool create_folder = true);
// Returns user specified category for uploads, returns default id if there are no
// user specified one or it does not exist, creates default category if it is missing.
const LLUUID findUserDefinedCategoryUUIDForType(LLFolderType::EType preferred_type);
// Get whatever special folder this object is a child of, if any.
const LLViewerInventoryCategory *getFirstNondefaultParent(const LLUUID& obj_id) const;

View File

@ -178,8 +178,8 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&LLInventoryPanel::attachObject, this, _2));
mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this));
mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars, this));
mCommitCallbackRegistrar.add("Inventory.FileUploadLocation", boost::bind(&LLInventoryPanel::fileUploadLocation, this, _2));
mCommitCallbackRegistrar.add("Inventory.CustomAction", boost::bind(&LLInventoryPanel::onCustomAction, this, _2)); // <FS:Ansariel> Prevent warning "No callback found for: 'Inventory.CustomAction' in control: Find Links"
}
LLFolderView * LLInventoryPanel::createFolderRoot(LLUUID root_id )
@ -1320,6 +1320,27 @@ bool LLInventoryPanel::beginIMSession()
return true;
}
void LLInventoryPanel::fileUploadLocation(const LLSD& userdata)
{
const std::string param = userdata.asString();
if (param == "model")
{
gSavedPerAccountSettings.setString("ModelUploadFolder", LLFolderBridge::sSelf.get()->getUUID().asString());
}
else if (param == "texture")
{
gSavedPerAccountSettings.setString("TextureUploadFolder", LLFolderBridge::sSelf.get()->getUUID().asString());
}
else if (param == "sound")
{
gSavedPerAccountSettings.setString("SoundUploadFolder", LLFolderBridge::sSelf.get()->getUUID().asString());
}
else if (param == "animation")
{
gSavedPerAccountSettings.setString("AnimationUploadFolder", LLFolderBridge::sSelf.get()->getUUID().asString());
}
}
bool LLInventoryPanel::attachObject(const LLSD& userdata)
{
// Copy selected item UUIDs to a vector.

View File

@ -210,6 +210,7 @@ public:
void onCustomAction(const LLSD& userdata); // <FS:Ansariel> Prevent warning "No callback found for: 'Inventory.CustomAction' in control: Find Links"
void doCreate(const LLSD& userdata);
bool beginIMSession();
void fileUploadLocation(const LLSD& userdata);
bool attachObject(const LLSD& userdata);
static void idle(void* user_data);

View File

@ -2036,8 +2036,8 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
LLSD result;
LLSD res;
result["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);
result["texture_folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE);
result["folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_OBJECT);
result["texture_folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE);
result["asset_type"] = "mesh";
result["inventory_type"] = "object";
result["description"] = "(No Description)";
@ -3582,11 +3582,11 @@ void LLMeshRepository::notifyLoadedMeshes()
// Handle addition of texture, if any.
if ( data.mResponse.has("new_texture_folder_id") )
{
const LLUUID& folder_id = data.mResponse["new_texture_folder_id"].asUUID();
const LLUUID& new_folder_id = data.mResponse["new_texture_folder_id"].asUUID();
if ( folder_id.notNull() )
if ( new_folder_id.notNull() )
{
LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE);
LLUUID parent_id = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE);
std::string name;
// Check if the server built a different name for the texture folder
@ -3601,7 +3601,7 @@ void LLMeshRepository::notifyLoadedMeshes()
// Add the category to the internal representation
LLPointer<LLViewerInventoryCategory> cat =
new LLViewerInventoryCategory(folder_id, parent_id,
new LLViewerInventoryCategory(new_folder_id, parent_id,
LLFolderType::FT_NONE, name, gAgent.getID());
cat->setVersion(LLViewerInventoryCategory::VERSION_UNKNOWN);

View File

@ -146,6 +146,9 @@ void LLPanelBlockedList::updateButtons()
bool hasSelected = NULL != mBlockedList->getSelectedItem();
getChildView("unblock_btn")->setEnabled(hasSelected);
getChildView("blocked_gear_btn")->setEnabled(hasSelected);
getChild<LLUICtrl>("block_limit")->setTextArg("[COUNT]", llformat("%d", mBlockedList->getMuteListSize()));
getChild<LLUICtrl>("block_limit")->setTextArg("[LIMIT]", llformat("%d", gSavedSettings.getS32("MuteListLimit")));
}
void LLPanelBlockedList::unblockItem()

View File

@ -750,7 +750,7 @@ void LLPanelFace::getState()
updateUI();
}
void LLPanelFace::updateUI()
void LLPanelFace::updateUI(bool force_set_values /*false*/)
{ //set state of UI to match state of texture entry(ies) (calls setEnabled, setValue, etc, but NOT setVisible)
LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
@ -1146,7 +1146,14 @@ void LLPanelFace::updateUI()
mCtrlBumpyScaleV->setEnabled(editable && normmap_id.notNull()
&& enable_material_controls); // <FS:CR> Materials alignment
mCtrlTexScaleV->setValue(diff_scale_t);
if (force_set_values)
{
mCtrlTexScaleV->forceSetValue(diff_scale_t);
}
else
{
mCtrlTexScaleV->setValue(diff_scale_t);
}
mCtrlShinyScaleV->setValue(norm_scale_t);
mCtrlBumpyScaleV->setValue(spec_scale_t);
@ -1366,9 +1373,18 @@ void LLPanelFace::updateUI()
BOOL repeats_tentative = !identical_repeats;
mCtrlRpt->setEnabled(identical_planar_texgen ? FALSE : enabled);
mCtrlRpt->setValue(editable ? repeats : 1.0f);
//LLSpinCtrl* rpt_ctrl = getChild<LLSpinCtrl>("rptctrl");
if (force_set_values)
{
//onCommit, previosly edited element updates related ones
mCtrlRpt->forceSetValue(editable ? repeats : 1.0f);
}
else
{
mCtrlRpt->setValue(editable ? repeats : 1.0f);
}
mCtrlRpt->setTentative(LLSD(repeats_tentative));
// <FS:CR> FIRE-11407 - Flip buttons
getChildView("flipTextureScaleU")->setEnabled(enabled);
getChildView("flipTextureScaleV")->setEnabled(enabled);
@ -2115,6 +2131,8 @@ void LLPanelFace::onCommitTextureInfo( LLUICtrl* ctrl, void* userdata )
{
LLPanelFace* self = (LLPanelFace*) userdata;
self->sendTextureInfo();
// vertical scale and repeats per meter depends on each other, so force set on changes
self->updateUI(true);
// <FS:CR> Materials alignment
if (gSavedSettings.getBOOL("FSSyncronizeTextureMaps"))
{
@ -2185,6 +2203,8 @@ void LLPanelFace::onCommitRepeatsPerMeter(LLUICtrl* ctrl, void* userdata)
llassert(false);
break;
}
// vertical scale and repeats per meter depends on each other, so force set on changes
self->updateUI(true);
}
struct LLPanelFaceSetMediaFunctor : public LLSelectedTEFunctor

View File

@ -154,7 +154,8 @@ protected:
// Make UI reflect state of currently selected material (refresh)
// and UI mode (e.g. editing normal map v diffuse map)
//
void updateUI();
// @param force_set_values forces spinners to set value even if they are focused
void updateUI(bool force_set_values = false);
// Convenience func to determine if all faces in selection have
// identical planar texgen settings during edits

View File

@ -1655,6 +1655,7 @@ LLPanelObjectInventory::LLPanelObjectInventory(const LLPanelObjectInventory::Par
mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&do_nothing));
mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&do_nothing));
mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars, this));
mCommitCallbackRegistrar.add("Inventory.FileUploadLocation", boost::bind(&do_nothing));
mCommitCallbackRegistrar.add("Inventory.CustomAction", boost::bind(&do_nothing)); // <FS:Ansariel> Prevent warning "No callback found for: 'Inventory.CustomAction' in control: Find Links"
}
@ -2000,6 +2001,7 @@ void LLPanelObjectInventory::refresh()
if(mTaskUUID != object->mID)
{
mTaskUUID = object->mID;
mAttachmentUUID = object->getAttachmentItemID();
make_request = TRUE;
// This is a new object so pre-emptively clear the contents
@ -2009,6 +2011,16 @@ void LLPanelObjectInventory::refresh()
// Register for updates from this object,
registerVOInventoryListener(object,NULL);
}
else if (mAttachmentUUID != object->getAttachmentItemID())
{
mAttachmentUUID = object->getAttachmentItemID();
if (mAttachmentUUID.notNull())
{
// Server unsubsribes viewer (deselects object) from property
// updates after "ObjectAttach" so we need to resubscribe
LLSelectMgr::getInstance()->sendSelect();
}
}
// Based on the node information, we may need to dirty the
// object inventory and get it again.
@ -2039,6 +2051,7 @@ void LLPanelObjectInventory::refresh()
void LLPanelObjectInventory::clearInventoryTask()
{
mTaskUUID = LLUUID::null;
mAttachmentUUID = LLUUID::null;
removeVOInventoryListener();
clearContents();
}

View File

@ -108,6 +108,7 @@ private:
LLFolderView* mFolders;
LLUUID mTaskUUID;
LLUUID mAttachmentUUID;
BOOL mHaveInventory;
BOOL mIsInventoryEmpty;
BOOL mInventoryNeedsUpdate;

View File

@ -4576,6 +4576,9 @@ void LLSelectMgr::sendAttach(U8 attachment_point, bool replace)
SEND_ONLY_ROOTS );
if (!build_mode)
{
// After "ObjectAttach" server will unsubscribe us from properties updates
// so either deselect objects or resend selection after attach packet reaches server
// In case of build_mode LLPanelObjectInventory::refresh() will deal with selection
deselectAll();
}
}
@ -7385,7 +7388,7 @@ F32 LLObjectSelection::getSelectedLinksetCost()
LLSelectNode* node = *iter;
LLViewerObject* object = node->getObject();
if (object)
if (object && !object->isAttachment())
{
LLViewerObject* root = static_cast<LLViewerObject*>(object->getRoot());
if (root)

View File

@ -818,23 +818,7 @@ void LLSidepanelItemInfo::onCommitName()
{
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
new_item->rename(labelItemName->getText());
if(mObjectID.isNull())
{
new_item->updateServer(FALSE);
gInventory.updateItem(new_item);
gInventory.notifyObservers();
}
else
{
LLViewerObject* object = gObjectList.findObject(mObjectID);
if(object)
{
object->updateInventory(
new_item,
TASK_INVENTORY_ITEM_KEY,
false);
}
}
onCommitChanges(new_item);
}
}
@ -855,23 +839,7 @@ void LLSidepanelItemInfo::onCommitDescription()
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
new_item->setDescription(labelItemDesc->getText());
if(mObjectID.isNull())
{
new_item->updateServer(FALSE);
gInventory.updateItem(new_item);
gInventory.notifyObservers();
}
else
{
LLViewerObject* object = gObjectList.findObject(mObjectID);
if(object)
{
object->updateInventory(
new_item,
TASK_INVENTORY_ITEM_KEY,
false);
}
}
onCommitChanges(new_item);
}
}
@ -947,23 +915,7 @@ void LLSidepanelItemInfo::onCommitPermissions()
flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
}
new_item->setFlags(flags);
if(mObjectID.isNull())
{
new_item->updateServer(FALSE);
gInventory.updateItem(new_item);
gInventory.notifyObservers();
}
else
{
LLViewerObject* object = gObjectList.findObject(mObjectID);
if(object)
{
object->updateInventory(
new_item,
TASK_INVENTORY_ITEM_KEY,
false);
}
}
onCommitChanges(new_item);
}
else
{
@ -1047,25 +999,7 @@ void LLSidepanelItemInfo::updateSaleInfo()
}
new_item->setSaleInfo(sale_info);
if(mObjectID.isNull())
{
// This is in the agent's inventory.
new_item->updateServer(FALSE);
gInventory.updateItem(new_item);
gInventory.notifyObservers();
}
else
{
// This is in an object's contents.
LLViewerObject* object = gObjectList.findObject(mObjectID);
if(object)
{
object->updateInventory(
new_item,
TASK_INVENTORY_ITEM_KEY,
false);
}
}
onCommitChanges(new_item);
}
else
{
@ -1074,6 +1008,45 @@ void LLSidepanelItemInfo::updateSaleInfo()
}
}
void LLSidepanelItemInfo::onCommitChanges(LLPointer<LLViewerInventoryItem> item)
{
if (item.isNull())
{
return;
}
if (mObjectID.isNull())
{
// This is in the agent's inventory.
item->updateServer(FALSE);
gInventory.updateItem(item);
gInventory.notifyObservers();
}
else
{
// This is in an object's contents.
LLViewerObject* object = gObjectList.findObject(mObjectID);
if (object)
{
object->updateInventory(
item,
TASK_INVENTORY_ITEM_KEY,
false);
if (object->isSelected())
{
// Since object is selected (build floater is open) object will
// receive properties update, detect serial mismatch, dirty and
// reload inventory, meanwhile some other updates will refresh it.
// So mark dirty early, this will prevent unnecessary changes
// and download will be triggered by LLPanelObjectInventory - it
// prevents flashing in content tab and some duplicated request.
object->dirtyInventory();
}
}
}
}
LLViewerInventoryItem* LLSidepanelItemInfo::findItem() const
{
LLViewerInventoryItem* item = NULL;

View File

@ -89,6 +89,7 @@ protected:
void onCommitSaleInfo();
void onCommitSaleType();
void updateSaleInfo();
void onCommitChanges(LLPointer<LLViewerInventoryItem> item);
};
#endif // LL_LLSIDEPANELITEMINFO_H

View File

@ -3053,7 +3053,7 @@ void login_callback(S32 option, void *userdata)
void show_release_notes_if_required()
{
if (LLVersionInfo::getChannelAndVersion() != gLastRunVersion
&& LLVersionInfo::getChannel() != "Second Life Test" // don't show Release Notes for the test builds
&& LLVersionInfo::getViewerMaturity() != LLVersionInfo::TEST_VIEWER // don't show Release Notes for the test builds
&& gSavedSettings.getBOOL("UpdaterShowReleaseNotes")
&& !gSavedSettings.getBOOL("FirstLoginThisInstall"))
{

View File

@ -310,10 +310,9 @@ void LLResourceUploadInfo::assignDefaults()
mDescription = "(No Description)";
}
mFolderId = gInventory.findCategoryUUIDForType(
mFolderId = gInventory.findUserDefinedCategoryUUIDForType(
(mDestinationFolderType == LLFolderType::FT_NONE) ?
(LLFolderType::EType)mAssetType : mDestinationFolderType);
}
std::string LLResourceUploadInfo::getDisplayName() const

View File

@ -204,5 +204,12 @@
layout="topleft"
help_topic="preferences_backup_tab"
name="backup" />
<panel
class="panel_preference"
filename="panel_preferences_uploads.xml"
label="Uploads"
layout="topleft"
help_topic="preferences_uploads_tab"
name="uploads" />
</tab_container>
</floater>

View File

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<multi_floater
single_instance="true"
reuse_instance="true"
can_resize="true"
height="233"
layout="topleft"
@ -9,6 +8,7 @@
help_topic="script_debug_floater"
save_rect="true"
title="Script Warning/Error/Debug"
reuse_instance="true"
width="450">
<tab_container
background_visible="false"

View File

@ -321,6 +321,43 @@
parameter="eyes" />
</menu_item_call>
</menu>
<menu
label="Use as default for"
layout="topleft"
name="upload_def">
<menu_item_call
label="Image uploads"
layout="topleft"
name="Image uploads">
<menu_item_call.on_click
function="Inventory.FileUploadLocation"
parameter="texture" />
</menu_item_call>
<menu_item_call
label="Sound uploads"
layout="topleft"
name="Sound uploads">
<menu_item_call.on_click
function="Inventory.FileUploadLocation"
parameter="sound" />
</menu_item_call>
<menu_item_call
label="Animation uploads"
layout="topleft"
name="Animation uploads">
<menu_item_call.on_click
function="Inventory.FileUploadLocation"
parameter="animation" />
</menu_item_call>
<menu_item_call
label="Model uploads"
layout="topleft"
name="Model uploads">
<menu_item_call.on_click
function="Inventory.FileUploadLocation"
parameter="model" />
</menu_item_call>
</menu>
<menu
label="Change Type"
layout="topleft"

View File

@ -11042,29 +11042,29 @@ Eject failed because you don't have admin permission for that parcel.
<notification
icon="alertmodal.tga"
name="CantMoveObjectParcelFull"
name="CMOParcelFull"
type="notify">
<tag>fail</tag>
Can't move object '[OBJECT_NAME]' to
[OBJ_POSITION] in region [REGION_NAME] because the parcel is full.
Can't move object '[O]' to
[P] in region [R] because the parcel is full.
</notification>
<notification
icon="alertmodal.tga"
name="CantMoveObjectParcelPerms"
name="CMOParcelPerms"
type="notify">
<tag>fail</tag>
Can't move object '[OBJECT_NAME]' to
[OBJ_POSITION] in region [REGION_NAME] because your objects are not allowed on this parcel.
Can't move object '[O]' to
[P] in region [R] because your objects are not allowed on this parcel.
</notification>
<notification
icon="alertmodal.tga"
name="CantMoveObjectParcelResources"
name="CMOParcelResources"
type="notify">
<tag>fail</tag>
Can't move object '[OBJECT_NAME]' to
[OBJ_POSITION] in region [REGION_NAME] because there are not enough resources for this object on this parcel.
Can't move object '[O]' to
[P] in region [R] because there are not enough resources for this object on this parcel.
</notification>
<notification
@ -11077,29 +11077,29 @@ Copy failed because you lack access to that parcel.
<notification
icon="alertmodal.tga"
name="CantMoveObjectRegionVersion"
name="CMORegionVersion"
type="notify">
<tag>fail</tag>
Can't move object '[OBJECT_NAME]' to
[OBJ_POSITION] in region [REGION_NAME] because the other region is running an older version which does not support receiving this object via region crossing.
<tag>fail</tag>
Can't move object '[O]' to
[P] in region [R] because the other region is running an older version which does not support receiving this object via region crossing.
</notification>
<notification
icon="alertmodal.tga"
name="CantMoveObjectNavMesh"
name="CMONavMesh"
type="notify">
<tag>fail</tag>
Can't move object '[OBJECT_NAME]' to
[OBJ_POSITION] in region [REGION_NAME] because you cannot modify the navmesh across region boundaries.
Can't move object '[O]' to
[P] in region [R] because you cannot modify the navmesh across region boundaries.
</notification>
<notification
icon="alertmodal.tga"
name="CantMoveObjectWTF"
name="CMOWTF"
type="notify">
<tag>fail</tag>
Can't move object '[OBJECT_NAME]' to
[OBJ_POSITION] in region [REGION_NAME] because of an unknown reason. ([FAILURE_TYPE])
Can't move object '[O]' to
[P] in region [R] because of an unknown reason. ([F])
</notification>
<notification

View File

@ -88,13 +88,26 @@
top_delta="0"
width="31"/>
</panel>
<text
type="string"
length="1"
follows="left|top|right"
height="14"
layout="topleft"
right="-10"
top_pad="4"
left="3"
use_ellipses="true"
name="block_limit">
[COUNT] entries in your block list, and the limit is [LIMIT].
</text>
<block_list
follows="all"
height="273"
height="255"
layout="topleft"
left="3"
name="blocked"
tool_tip="List of currently blocked Residents"
top="31"
top_pad="4"
right="-1"/>
</panel>

View File

@ -0,0 +1,135 @@
<?xml version="1.0" encoding="UTF-8"?>
<panel
border="true"
follows="all"
height="408"
label="Uploads"
layout="topleft"
left="102"
name="uploads"
top="1"
width="517">
<text
type="string"
length="1"
follows="left|top"
height="12"
layout="topleft"
left="33"
name="title"
top_pad="10"
width="250">
Current destination folders for uploads
</text>
<text
type="string"
length="1"
follows="left|top"
height="12"
layout="topleft"
left="37"
name="title_models"
top_pad="17"
width="100">
Images
</text>
<text
type="string"
use_ellipses="true"
follows="left|top"
height="23"
layout="topleft"
font.style="BOLD"
left="37"
name="upload_textures"
top_pad="5"
width="350" />
<text
type="string"
length="1"
follows="left|top"
height="12"
layout="topleft"
left="37"
name="title_sounds"
top_pad="7"
width="100">
Sounds
</text>
<text
type="string"
use_ellipses="true"
follows="left|top"
height="23"
layout="topleft"
font.style="BOLD"
left="37"
name="upload_sounds"
top_pad="5"
width="350" />
<text
type="string"
length="1"
follows="left|top"
height="12"
layout="topleft"
left="37"
name="title_animation"
top_pad="7"
width="100">
Animations
</text>
<text
type="string"
use_ellipses="true"
follows="left|top"
height="23"
layout="topleft"
font.style="BOLD"
left="37"
name="upload_animation"
top_pad="5"
width="350" />
<text
type="string"
length="1"
follows="left|top"
height="12"
layout="topleft"
left="37"
name="title_animation"
top_pad="7"
width="100">
Models
</text>
<text
type="string"
use_ellipses="true"
follows="left|top"
height="23"
layout="topleft"
font.style="BOLD"
left="37"
name="upload_models"
top_pad="5"
width="350" />
<text
type="string"
length="1"
follows="left|top"
height="30"
layout="topleft"
font.style="ITALIC"
left="33"
name="upload_help"
top_pad="6"
width="387">
To change a destination folder, right click on it in inventory and choose
"Use as default for"
</text>
</panel>