diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 45c64a4ef..90cff3cdc 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -2863,15 +2863,10 @@ class LLObjectExport : public view_listener_t bool handleEvent(LLPointer event, const LLSD& userdata) { LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); - if (!object) return true; - - LLVOAvatar* avatar = find_avatar_from_object(object); - - if (!avatar) + if (object) { LLObjectBackup::getInstance()->exportObject(); } - return true; } }; diff --git a/indra/newview/llviewerobjectbackup.cpp b/indra/newview/llviewerobjectbackup.cpp index 0ec25719e..f131f07dc 100644 --- a/indra/newview/llviewerobjectbackup.cpp +++ b/indra/newview/llviewerobjectbackup.cpp @@ -34,12 +34,10 @@ #include #include -#include "hippogridmanager.h" - // linden library includes #include "indra_constants.h" -#include "llapr.h" #include "llalertdialog.h" +#include "llapr.h" #include "llcallbacklist.h" #include "lldir.h" #include "lleconomy.h" @@ -79,9 +77,37 @@ #include "llviewerstats.h" #include "llviewerwindow.h" +#include "hippogridmanager.h" + #include "llviewerobjectbackup.h" -LLObjectBackup* LLObjectBackup::sInstance = 0; +LLObjectBackup* LLObjectBackup::sInstance = NULL; + +// Note: these default textures are initialized with hard coded values to +// prevent cheating. When not in SL, the user-configurable values are used +// instead (see setDefaultTextures() below). +static LLUUID LL_TEXTURE_PLYWOOD = LLUUID("89556747-24cb-43ed-920b-47caed15465f"); +static LLUUID LL_TEXTURE_BLANK = LLUUID("5748decc-f629-461c-9a36-a35a221fe21f"); +static LLUUID LL_TEXTURE_INVISIBLE = LLUUID("38b86f85-2575-52a9-a531-23108d8da837"); +static LLUUID LL_TEXTURE_TRANSPARENT = LLUUID("8dcd4a48-2d37-4909-9f78-f7a9eb4ef903"); +static LLUUID LL_TEXTURE_MEDIA = LLUUID("8b5fec65-8d8d-9dc5-cda8-8fdf2716e361"); + +void setDefaultTextures() +{ + if (!gHippoGridManager->getConnectedGrid()->isSecondLife()) + { + // When not in SL (no texture perm check needed), we can get these + // defaults from the user settings... + LL_TEXTURE_PLYWOOD = LLUUID(gSavedSettings.getString("DefaultObjectTexture")); + LL_TEXTURE_BLANK = LLUUID(gSavedSettings.getString("UIImgWhiteUUID")); + if (gSavedSettings.controlExists("UIImgInvisibleUUID")) + { + // This control only exists in the Cool VL Viewer (added by the + // AllowInvisibleTextureInPicker patch) + LL_TEXTURE_INVISIBLE = LLUUID(gSavedSettings.getString("UIImgInvisibleUUID")); + } + } +} class importResponder: public LLNewAgentInventoryResponder { @@ -95,7 +121,7 @@ public: //virtual virtual void uploadComplete(const LLSD& content) { - lldebugs << "LLNewAgentInventoryResponder::result from capabilities" << llendl; + LL_DEBUGS("ObjectBackup") << "LLNewAgentInventoryResponder::result from capabilities" << LL_ENDL; LLAssetType::EType asset_type = LLAssetType::lookup(mPostData["asset_type"].asString()); LLInventoryType::EType inventory_type = LLInventoryType::lookup(mPostData["inventory_type"].asString()); @@ -120,8 +146,8 @@ public: } // Actually add the upload to viewer inventory - llinfos << "Adding " << content["new_inventory_item"].asUUID() << " " - << content["new_asset"].asUUID() << " to inventory." << llendl; + LL_INFOS("ObjectBackup") << "Adding " << content["new_inventory_item"].asUUID() << " " + << content["new_asset"].asUUID() << " to inventory." << LL_ENDL; if (mPostData["folder_id"].asUUID().notNull()) { LLPermissions perm; @@ -154,7 +180,7 @@ public: } else { - llwarns << "Can't find a folder to put it into" << llendl; + LL_WARNS("ObjectBackup") << "Can't find a folder to put it into" << LL_ENDL; } // remove the "Uploading..." message @@ -177,7 +203,7 @@ public: { if (imageformat == IMG_CODEC_TGA && mFormattedImage->getCodec() == IMG_CODEC_J2C) { - llwarns << "FAILED: texture " << mID << " is formatted as TGA. Not saving." << llendl; + LL_WARNS("ObjectBackup") << "FAILED: texture " << mID << " is formatted as TGA. Not saving." << LL_ENDL; LLObjectBackup::getInstance()->mNonExportedTextures |= LLObjectBackup::TEXTURE_BAD_ENCODING; mFormattedImage = NULL; mImageSize = 0; @@ -202,14 +228,14 @@ public: { if (success && mFormattedImage.notNull() && mImageSize > 0) { - llinfos << "SUCCESS getting texture " << mID << llendl; + LL_INFOS("ObjectBackup") << "SUCCESS getting texture " << mID << LL_ENDL; std::string name; mID.toString(name); name = LLObjectBackup::getInstance()->getfolder() + "//" + name; - llinfos << "Saving to " << name << llendl; + LL_INFOS("ObjectBackup") << "Saving to " << name << LL_ENDL; if (!mFormattedImage->save(name)) { - llwarns << "FAILED to save texture " << mID << llendl; + LL_WARNS("ObjectBackup") << "FAILED to save texture " << mID << LL_ENDL; LLObjectBackup::getInstance()->mNonExportedTextures |= LLObjectBackup::TEXTURE_SAVED_FAILED; } } @@ -217,12 +243,12 @@ public: { if (!success) { - llwarns << "FAILED to get texture " << mID << llendl; + LL_WARNS("ObjectBackup") << "FAILED to get texture " << mID << LL_ENDL; LLObjectBackup::getInstance()->mNonExportedTextures |= LLObjectBackup::TEXTURE_MISSING; } if (mFormattedImage.isNull()) { - llwarns << "FAILED: NULL texture " << mID << llendl; + LL_WARNS("ObjectBackup") << "FAILED: NULL texture " << mID << LL_ENDL; LLObjectBackup::getInstance()->mNonExportedTextures |= LLObjectBackup::TEXTURE_IS_NULL; } } @@ -340,6 +366,9 @@ void LLObjectBackup::exportObject() mLLSD.clear(); mThisGroup.clear(); + setDefaultTextures(); + LLSelectMgr::getInstance()->getSelection()->ref(); + // Open the file save dialog AIFilePicker* filepicker = AIFilePicker::create(); filepicker->open("", FFSAVE_XML); @@ -351,6 +380,7 @@ void LLObjectBackup::exportObject_continued(AIFilePicker* filepicker) if (!filepicker->hasFilename()) { // User canceled save. + LLSelectMgr::getInstance()->getSelection()->unref(); return; } @@ -365,7 +395,7 @@ void LLObjectBackup::exportObject_continued(AIFilePicker* filepicker) bool LLObjectBackup::validatePerms(const LLPermissions *item_permissions) { - if (gHippoGridManager->getConnectedGrid()->getPlatform() == HippoGridInfo::PLATFORM_SECONDLIFE) + if (gHippoGridManager->getConnectedGrid()->isSecondLife()) { // In Second Life, you must be the creator to be permitted to export the asset. return (gAgent.getID() == item_permissions->getOwner() && @@ -390,12 +420,21 @@ bool LLObjectBackup::validatePerms(const LLPermissions *item_permissions) // the textures in the Library), whoever is the actual creator... Go figure ! LLUUID LLObjectBackup::validateTextureID(LLUUID asset_id) { - if (gHippoGridManager->getConnectedGrid()->getPlatform() != HippoGridInfo::PLATFORM_SECONDLIFE) + if (!gHippoGridManager->getConnectedGrid()->isSecondLife()) { // If we are not in Second Life, don't bother. return asset_id; } - LLUUID texture = LLUUID(gSavedSettings.getString("DefaultObjectTexture")); + LLUUID texture = LL_TEXTURE_PLYWOOD; + if (asset_id == texture || + asset_id == LL_TEXTURE_BLANK || + asset_id == LL_TEXTURE_INVISIBLE || + asset_id == LL_TEXTURE_TRANSPARENT || + asset_id == LL_TEXTURE_MEDIA) + { + // Allow to export a few default SL textures. + return asset_id; + } LLViewerInventoryCategory::cat_array_t cats; LLViewerInventoryItem::item_array_t items; LLAssetIDMatches asset_id_matches(asset_id); @@ -434,7 +473,6 @@ void LLObjectBackup::exportWorker(void *userdata) case EXPORT_INIT: { LLObjectBackup::getInstance()->show(true); - LLSelectMgr::getInstance()->getSelection()->ref(); struct ff : public LLSelectedNodeFunctor { virtual bool apply(LLSelectNode* node) @@ -449,7 +487,7 @@ void LLObjectBackup::exportWorker(void *userdata) } else { - llwarns << "Incorrect permission to export" << llendl; + LL_WARNS("ObjectBackup") << "Incorrect permission to export" << LL_ENDL; LLObjectBackup::getInstance()->mExportState = EXPORT_FAILED; LLSelectMgr::getInstance()->getSelection()->unref(); } @@ -462,13 +500,22 @@ void LLObjectBackup::exportWorker(void *userdata) { virtual bool apply(LLViewerObject* object) { + bool is_attachment = object->isAttachment(); object->boostTexturePriority(TRUE); LLViewerObject::child_list_t children = object->getChildren(); children.push_front(object); //push root onto list - LLSD prim_llsd = LLObjectBackup::getInstance()->primsToLLSD(children); + LLSD prim_llsd = LLObjectBackup::getInstance()->primsToLLSD(children, is_attachment); LLSD stuff; - stuff["root_position"] = object->getPosition().getValue(); - stuff["root_rotation"] = ll_sd_from_quaternion(object->getRotation()); + if (is_attachment) + { + stuff["root_position"] = object->getPositionEdit().getValue(); + stuff["root_rotation"] = ll_sd_from_quaternion(object->getRotationEdit()); + } + else + { + stuff["root_position"] = object->getPosition().getValue(); + stuff["root_rotation"] = ll_sd_from_quaternion(object->getRotation()); + } stuff["group_body"] = prim_llsd; LLObjectBackup::getInstance()->mLLSD["data"].append(stuff); return true; @@ -512,12 +559,12 @@ void LLObjectBackup::exportWorker(void *userdata) gIdleCallbacks.deleteFunction(exportWorker); if (LLObjectBackup::getInstance()->mNonExportedTextures == LLObjectBackup::TEXTURE_OK) { - llinfos << "Export successful and complete." << llendl; + LL_INFOS("ObjectBackup") << "Export successful and complete." << LL_ENDL; LLNotifications::instance().add("ExportSuccessful"); } else { - llinfos << "Export successful but incomplete: some texture(s) not saved." << llendl; + LL_INFOS("ObjectBackup") << "Export successful but incomplete: some texture(s) not saved." << LL_ENDL; std::string reason; if (LLObjectBackup::getInstance()->mNonExportedTextures & LLObjectBackup::TEXTURE_BAD_PERM) { @@ -525,7 +572,7 @@ void LLObjectBackup::exportWorker(void *userdata) } if (LLObjectBackup::getInstance()->mNonExportedTextures & LLObjectBackup::TEXTURE_MISSING) { - reason += "\nMissing texture."; + reason += "\nMissing texture (retrying after full rezzing might work)."; } if (LLObjectBackup::getInstance()->mNonExportedTextures & LLObjectBackup::TEXTURE_BAD_ENCODING) { @@ -548,14 +595,14 @@ void LLObjectBackup::exportWorker(void *userdata) case EXPORT_FAILED: gIdleCallbacks.deleteFunction(exportWorker); - llwarns << "Export process aborted." << llendl; + LL_WARNS("ObjectBackup") << "Export process aborted." << LL_ENDL; LLNotifications::instance().add("ExportFailed"); LLObjectBackup::getInstance()->close(); break; } } -LLSD LLObjectBackup::primsToLLSD(LLViewerObject::child_list_t child_list) +LLSD LLObjectBackup::primsToLLSD(LLViewerObject::child_list_t child_list, bool is_attachment) { LLViewerObject* object; LLSD llsd; @@ -566,7 +613,7 @@ LLSD LLObjectBackup::primsToLLSD(LLViewerObject::child_list_t child_list) object = (*i); LLUUID id = object->getID(); - llinfos << "Exporting prim " << object->getID().asString() << llendl; + LL_INFOS("ObjectBackup") << "Exporting prim " << object->getID().asString() << LL_ENDL; // Create an LLSD object that represents this prim. It will be injected in to the overall LLSD // tree structure @@ -588,9 +635,17 @@ LLSD LLObjectBackup::primsToLLSD(LLViewerObject::child_list_t child_list) } // Transforms - prim_llsd["position"] = object->getPosition().getValue(); + if (is_attachment) + { + prim_llsd["position"] = object->getPositionEdit().getValue(); + prim_llsd["rotation"] = ll_sd_from_quaternion(object->getRotationEdit()); + } + else + { + prim_llsd["position"] = object->getPosition().getValue(); + prim_llsd["rotation"] = ll_sd_from_quaternion(object->getRotation()); + } prim_llsd["scale"] = object->getScale().getValue(); - prim_llsd["rotation"] = ll_sd_from_quaternion(object->getRotation()); // Flags prim_llsd["shadows"] = object->flagCastShadows(); @@ -632,13 +687,13 @@ LLSD LLObjectBackup::primsToLLSD(LLViewerObject::child_list_t child_list) } if (alreadyseen == false) { - llinfos << "Found a sculpt texture, adding to list " << sculpt_texture << llendl; + LL_INFOS("ObjectBackup") << "Found a sculpt texture, adding to list " << sculpt_texture << LL_ENDL; mTexturesList.push_back(sculpt_texture); } } else { - llwarns << "Incorrect permission to export a sculpt texture." << llendl; + LL_WARNS("ObjectBackup") << "Incorrect permission to export a sculpt texture." << LL_ENDL; LLObjectBackup::getInstance()->mExportState = EXPORT_FAILED; } } @@ -655,14 +710,22 @@ LLSD LLObjectBackup::primsToLLSD(LLViewerObject::child_list_t child_list) this_te_llsd = object->getTE(i)->asLLSD(); this_te_llsd["imageid"] = t_id; te_llsd.append(this_te_llsd); - std::list::iterator iter; - for (iter = mTexturesList.begin(); iter != mTexturesList.end(); iter++) - { - if ((*iter) == t_id) - alreadyseen = true; + // Do not export Linden textures even though they don't taint creation. + if (t_id != LL_TEXTURE_PLYWOOD && + t_id != LL_TEXTURE_BLANK && + t_id != LL_TEXTURE_TRANSPARENT && + t_id != LL_TEXTURE_INVISIBLE && + t_id != LL_TEXTURE_MEDIA) + { + std::list::iterator iter; + for (iter = mTexturesList.begin(); iter != mTexturesList.end(); iter++) + { + if ((*iter) == t_id) + alreadyseen = true; + } + if (alreadyseen == false) + mTexturesList.push_back(t_id); } - if (alreadyseen == false) - mTexturesList.push_back(t_id); } prim_llsd["textures"] = te_llsd; @@ -679,7 +742,7 @@ void LLObjectBackup::exportNextTexture() { if (mTexturesList.empty()) { - llinfos << "Finished exporting textures." << llendl; + LL_INFOS("ObjectBackup") << "Finished exporting textures." << LL_ENDL; return; } @@ -687,7 +750,7 @@ void LLObjectBackup::exportNextTexture() std::list::iterator iter; iter = mTexturesList.begin(); - while (1) + while (true) { if (iter == mTexturesList.end()) { @@ -696,6 +759,13 @@ void LLObjectBackup::exportNextTexture() } id = (*iter); + if (id.isNull()) + { + // NULL texture id: just remove and ignore. + mTexturesList.remove(id); + iter = mTexturesList.begin(); + continue; + } LLViewerTexture* imagep = LLViewerTextureManager::findTexture(id); if (imagep != NULL) @@ -716,15 +786,17 @@ void LLObjectBackup::exportNextTexture() } else { - llwarns << "We *DON'T* have the texture " << llendl; + LL_WARNS("ObjectBackup") << "We *DON'T* have the texture " << id.asString() << LL_ENDL; mNonExportedTextures |= TEXTURE_MISSING; + mTexturesList.remove(id); + return; } iter++; } mTexturesList.remove(id); - llinfos << "Requesting texture " << id << llendl; + LL_INFOS("ObjectBackup") << "Requesting texture " << id << LL_ENDL; LLImageJ2C* mFormattedImage = new LLImageJ2C; CacheReadResponder* responder = new CacheReadResponder(id, mFormattedImage); LLAppViewer::getTextureCache()->readFromCache(id, LLWorkerThread::PRIORITY_HIGH, 0, 999999, responder); @@ -735,27 +807,33 @@ void LLObjectBackup::importObject(bool upload) mTexturesList.clear(); mAssetMap.clear(); mCurrentAsset = LLUUID::null; - + + setDefaultTextures(); + mRetexture = upload; - + // Open the file open dialog - AIFilePicker* filepicker = AIFilePicker::create(); + AIFilePicker* filepicker = new AIFilePicker; filepicker->open(FFLOAD_XML, "", "import"); filepicker->run(boost::bind(&LLObjectBackup::importObject_continued, this, filepicker)); - + return; } void LLObjectBackup::importObject_continued(AIFilePicker* filepicker) { if (!filepicker->hasFilename()) + { + // User canceled save. return; - - std::string file_name = filepicker->getFilename(); + } + + std::string file_name = filepicker->getFilename(); mFolder = gDirUtilp->getDirName(file_name); llifstream import_file(file_name); LLSDSerialize::fromXML(mLLSD, import_file); import_file.close(); + show(false); mAgentPos = gAgent.getPositionAgent(); mAgentRot = LLQuaternion(gAgent.getAtAxis(), gAgent.getLeftAxis(), gAgent.getUpAxis()); @@ -770,17 +848,6 @@ void LLObjectBackup::importObject_continued(AIFilePicker* filepicker) mObjects = mLLSD["data"].size(); mPrims = 0; mRezCount = 0; - - if (mObjects <= 0) { - LLSD args; - args["MESSAGE"] = std::string("Object import failed.\nThe XML file has an incompatible format or does not contain any objects."); - LLNotifications::instance().add("GenericAlert", args); - llwarns << "Trying to import illegal XML object file." << llendl; - return; - } - - show(false); - updateImportNumbers(); for (prim_arr_it = mLLSD["data"].beginArray(); prim_arr_it != mLLSD["data"].endArray(); prim_arr_it++) @@ -806,7 +873,7 @@ void LLObjectBackup::importObject_continued(AIFilePicker* filepicker) } if (alreadyseen == false) { - llinfos << "Found a new SCULPT texture to upload " << orig << llendl; + LL_INFOS("ObjectBackup") << "Found a new SCULPT texture to upload " << orig << LL_ENDL; mTexturesList.push_back(orig); } } @@ -819,18 +886,21 @@ void LLObjectBackup::importObject_continued(AIFilePicker* filepicker) LLTextureEntry te; te.fromLLSD(the_te); - te.getID(); - bool alreadyseen = false; + LLUUID id = te.getID(); + if (id != LL_TEXTURE_PLYWOOD && id != LL_TEXTURE_BLANK && id != LL_TEXTURE_INVISIBLE) // Do not upload the default textures + { + bool alreadyseen = false; - for (iter = mTexturesList.begin(); iter != mTexturesList.end(); iter++) - { - if ((*iter) == te.getID()) - alreadyseen = true; - } - if (alreadyseen == false) - { - llinfos << "Found a new texture to upload "<< te.getID() << llendl; - mTexturesList.push_back(te.getID()); + for (iter = mTexturesList.begin(); iter != mTexturesList.end(); iter++) + { + if ((*iter) == te.getID()) + alreadyseen = true; + } + if (alreadyseen == false) + { + LL_INFOS("ObjectBackup") << "Found a new texture to upload "<< te.getID() << LL_ENDL; + mTexturesList.push_back(te.getID()); + } } } } @@ -970,7 +1040,7 @@ void LLObjectBackup::xmlToPrim(LLSD prim_llsd, LLViewerObject* object) } // Textures - llinfos << "Processing textures for prim" << llendl; + LL_INFOS("ObjectBackup") << "Processing textures for prim" << LL_ENDL; LLSD te_llsd = prim_llsd["textures"]; LLSD::array_iterator text_it; U8 i = 0; @@ -990,7 +1060,7 @@ void LLObjectBackup::xmlToPrim(LLSD prim_llsd, LLViewerObject* object) object->setTE(i++, te); } - llinfos << "Textures done !" << llendl; + LL_INFOS("ObjectBackup") << "Textures done !" << LL_ENDL; //bump the iterator now so the callbacks hook together nicely //if (mPrimImportIter != mThisGroup.endMap()) @@ -1023,7 +1093,7 @@ void LLObjectBackup::primUpdate(LLViewerObject* object) if (mPrimImportIter == mThisGroup.endMap()) { - llinfos << "Trying to link" << llendl; + LL_INFOS("ObjectBackup") << "Trying to link" << LL_ENDL; if (mToSelect.size() > 1) { @@ -1053,7 +1123,7 @@ void LLObjectBackup::primUpdate(LLViewerObject* object) if (mToSelect.empty()) { - llwarns << "error: ran out of objects to mod." << llendl; + LL_WARNS("ObjectBackup") << "error: ran out of objects to mod." << LL_ENDL; return; } @@ -1085,7 +1155,7 @@ bool LLObjectBackup::newPrim(LLViewerObject* pobject) } else { - llinfos << "All prims rezzed, moving to build stage" << llendl; + LL_INFOS("ObjectBackup") << "All prims rezzed, moving to build stage" << LL_ENDL; // Deselecting is required to ensure that the first child prim // in the link set (which is also the last rezzed prim and thus // currently selected) will be properly renamed and desced. @@ -1104,7 +1174,7 @@ void LLObjectBackup::updateMap(LLUUID uploaded_asset) if (mCurrentAsset.isNull()) return; - llinfos << "Mapping " << mCurrentAsset << " to " << uploaded_asset << llendl; + LL_INFOS("ObjectBackup") << "Mapping " << mCurrentAsset << " to " << uploaded_asset << LL_ENDL; mAssetMap.insert(std::pair(mCurrentAsset, uploaded_asset)); } @@ -1140,13 +1210,13 @@ void myupload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ std::ostringstream llsdxml; LLSDSerialize::toXML(body, llsdxml); - lldebugs << "posting body to capability: " << llsdxml.str() << llendl; + LL_DEBUGS("ObjectBackup") << "posting body to capability: " << llsdxml.str() << LL_ENDL; //LLHTTPClient::post(url, body, new LLNewAgentInventoryResponder(body, uuid, asset_type)); LLHTTPClient::post(url, body, new importResponder(body, uuid, asset_type)); } else { - llinfos << "NewAgentInventory capability not found. Can't upload !" << llendl; + LL_INFOS("ObjectBackup") << "NewAgentInventory capability not found. Can't upload !" << LL_ENDL; } } @@ -1154,7 +1224,7 @@ void LLObjectBackup::uploadNextAsset() { if (mTexturesList.empty()) { - llinfos << "Texture list is empty, moving to rez stage." << llendl; + LL_INFOS("ObjectBackup") << "Texture list is empty, moving to rez stage." << LL_ENDL; mCurrentAsset = LLUUID::null; importFirstObject(); return; @@ -1167,7 +1237,7 @@ void LLObjectBackup::uploadNextAsset() LLUUID id = *iter; mTexturesList.pop_front(); - llinfos << "Got texture ID " << id << ": trying to upload" << llendl; + LL_INFOS("ObjectBackup") << "Got texture ID " << id << ": trying to upload" << LL_ENDL; mCurrentAsset = id; std::string struid; @@ -1182,7 +1252,7 @@ void LLObjectBackup::uploadNextAsset() S32 file_size; LLAPRFile outfile; - outfile.open(filename, LL_APR_RB, LLAPRFile::global, &file_size); + outfile.open(filename, LL_APR_RB, LLAPRFile::local, &file_size); if (outfile.getFileHandle()) { const S32 buf_size = 65536; @@ -1197,7 +1267,7 @@ void LLObjectBackup::uploadNextAsset() } else { - llwarns << "Unable to access output file " << filename << llendl; + LL_WARNS("ObjectBackup") << "Unable to access output file " << filename << LL_ENDL; uploadNextAsset(); return; } diff --git a/indra/newview/llviewerobjectbackup.h b/indra/newview/llviewerobjectbackup.h index 5ae33c382..8fa577dfe 100644 --- a/indra/newview/llviewerobjectbackup.h +++ b/indra/newview/llviewerobjectbackup.h @@ -107,7 +107,7 @@ private: LLUUID validateTextureID(LLUUID asset_id); // Convert a selection list of objects to LLSD - LLSD primsToLLSD(LLViewerObject::child_list_t child_list); + LLSD primsToLLSD(LLViewerObject::child_list_t child_list, bool is_attachment); // Start the import process void importFirstObject(); @@ -176,3 +176,4 @@ private: LLVector3 mAgentPos; LLQuaternion mAgentRot; }; + diff --git a/indra/newview/skins/default/xui/en-us/floater_object_backup.xml b/indra/newview/skins/default/xui/en-us/floater_object_backup.xml new file mode 100755 index 000000000..060c4421e --- /dev/null +++ b/indra/newview/skins/default/xui/en-us/floater_object_backup.xml @@ -0,0 +1,6 @@ + + + Progress +