// Callback when we rez a new object when the importer is running. bool LLObjectBackup::newPrim(LLViewerObject* pobject) { if (mRunning) { mRezCount++; mToSelect.push_back(pobject); updateImportNumbers(); mPrimImportIter++; pobject->setPosition(offsetAgent(LLVector3(0.0, 1.0, 0.0))); LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_POSITION); if (mPrimImportIter != mThisGroup.endMap()) { rezAgentOffset(LLVector3(1.0, 0.0 ,0.0)); } else { 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. LLSelectMgr::getInstance()->deselectAll(); mPrimImportIter = mThisGroup.beginMap(); LLSD prim_llsd = mThisGroup[mPrimImportIter->first]; mProcessIter = mToSelect.begin(); xmlToPrim(prim_llsd, *mProcessIter); } } return true; }
// This is fired when the update packet is processed so we know the prim settings have stuck void LLObjectBackup::primUpdate(LLViewerObject* object) { if (!mRunning) return; if (object != NULL) if (object->mID != mExpectingUpdate) return; mCurPrim++; updateImportNumbers(); mPrimImportIter++; LLUUID x; mExpectingUpdate = x.null; if (mPrimImportIter == mThisGroup.endMap()) { LL_INFOS("ObjectBackup") << "Trying to link" << LL_ENDL; if (mToSelect.size() > 1) { std::reverse(mToSelect.begin(), mToSelect.end()); // Now link LLSelectMgr::getInstance()->deselectAll(); LLSelectMgr::getInstance()->selectObjectAndFamily(mToSelect, true); LLSelectMgr::getInstance()->sendLink(); LLViewerObject* root = mToSelect.back(); root->setRotation(mRootRot); } mCurObject++; mGroupPrimImportIter++; if (mGroupPrimImportIter != mLLSD["data"].endArray()) { importNextObject(); return; } mRunning = false; close(); return; } LLSD prim_llsd = mThisGroup[mPrimImportIter->first]; if (mToSelect.empty()) { LL_WARNS("ObjectBackup") << "error: ran out of objects to mod." << LL_ENDL; return; } if (mPrimImportIter != mThisGroup.endMap()) { //rezAgentOffset(LLVector3(1.0, 0.0, 0.0)); LLSD prim_llsd = mThisGroup[mPrimImportIter->first]; mProcessIter++; xmlToPrim(prim_llsd, *mProcessIter); } }
void LLObjectBackup::uploadNextAsset() { if (mTexturesList.empty()) { llinfos << "Texture list is empty, moving to rez stage." << llendl; mCurrentAsset = LLUUID::null; importFirstObject(); return; } updateImportNumbers(); std::list<LLUUID>::iterator iter; iter = mTexturesList.begin(); LLUUID id = *iter; mTexturesList.pop_front(); llinfos << "Got texture ID " << id << ": trying to upload" << llendl; mCurrentAsset = id; std::string struid; id.toString(struid); std::string filename = mFolder + "//" + struid; LLAssetID uuid; LLTransactionID tid; // generate a new transaction ID for this asset tid.generate(); uuid = tid.makeAssetID(gAgent.getSecureSessionID()); S32 file_size; LLAPRFile outfile; outfile.open(filename, LL_APR_RB, LLAPRFile::global, &file_size); if (outfile.getFileHandle()) { const S32 buf_size = 65536; U8 copy_buf[buf_size]; LLVFile file(gVFS, uuid, LLAssetType::AT_TEXTURE, LLVFile::WRITE); file.setMaxSize(file_size); while ((file_size = outfile.read(copy_buf, buf_size))) { file.write(copy_buf, file_size); } outfile.close(); } else { llwarns << "Unable to access output file " << filename << llendl; uploadNextAsset(); return; } myupload_new_resource(tid, LLAssetType::AT_TEXTURE, struid, struid, 0, LLAssetType::AT_TEXTURE, LLInventoryType::defaultForAssetType(LLAssetType::AT_TEXTURE), 0x0, "Uploaded texture", NULL, NULL); }
void LLObjectBackup::importNextObject() { mToSelect.clear(); mRezCount = 0; mThisGroup = (*mGroupPrimImportIter)["group_body"]; mPrimImportIter = mThisGroup.beginMap(); mCurPrim = 0; mPrims = mThisGroup.size(); updateImportNumbers(); LLVector3 lgpos = (*mGroupPrimImportIter)["root_position"]; mGroupOffset = lgpos - mRootRootPos; mRootPos = offsetAgent(LLVector3(2.0, 0.0, 0.0)); mRootRot = ll_quaternion_from_sd((*mGroupPrimImportIter)["root_rotation"]); rezAgentOffset(LLVector3(0.0, 2.0, 0.0)); // Now we must wait for the callback when ViewerObjectList gets the new objects and we have the correct number selected }
void LLObjectBackup::importObject_continued(AIFilePicker* filepicker) { if (!filepicker->hasFilename()) { // User canceled save. return; } 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()); // Get the texture map LLSD::map_const_iterator prim_it; LLSD::array_const_iterator prim_arr_it; mCurObject = 1; mCurPrim = 1; mObjects = mLLSD["data"].size(); mPrims = 0; mRezCount = 0; updateImportNumbers(); for (prim_arr_it = mLLSD["data"].beginArray(); prim_arr_it != mLLSD["data"].endArray(); prim_arr_it++) { LLSD llsd2 = (*prim_arr_it)["group_body"]; for (prim_it = llsd2.beginMap(); prim_it != llsd2.endMap(); prim_it++) { LLSD prim_llsd = llsd2[prim_it->first]; LLSD::array_iterator text_it; std::list<LLUUID>::iterator iter; if (prim_llsd.has("sculpt")) { LLSculptParams* sculpt = new LLSculptParams(); sculpt->fromLLSD(prim_llsd["sculpt"]); LLUUID orig = sculpt->getSculptTexture(); bool alreadyseen = false; for (iter = mTexturesList.begin(); iter != mTexturesList.end(); iter++) { if ((*iter) == orig) alreadyseen = true; } if (alreadyseen == false) { LL_INFOS("ObjectBackup") << "Found a new SCULPT texture to upload " << orig << LL_ENDL; mTexturesList.push_back(orig); } } LLSD te_llsd = prim_llsd["textures"]; for (text_it = te_llsd.beginArray(); text_it != te_llsd.endArray(); text_it++) { LLSD the_te = (*text_it); LLTextureEntry te; te.fromLLSD(the_te); 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) { LL_INFOS("ObjectBackup") << "Found a new texture to upload "<< te.getID() << LL_ENDL; mTexturesList.push_back(te.getID()); } } } } } if (mRetexture == TRUE) uploadNextAsset(); else importFirstObject(); }
void LLObjectBackup::importObject_continued(AIFilePicker* filepicker) { if (!filepicker->hasFilename()) { // User canceled save. return; } std::string file_name = filepicker->getFilename(); mFolder = gDirUtilp->getDirName(file_name); llifstream import_file(file_name); LLSDSerialize::fromXML(mLLSD, import_file); import_file.close(); if (!mLLSD.has("data")) { LLNotificationsUtil::add("ImportFailed"); destroy(); return; } showFloater(false); mAgentPos = gAgent.getPositionAgent(); mAgentRot = LLQuaternion(gAgent.getAtAxis(), gAgent.getLeftAxis(), gAgent.getUpAxis()); // Get the texture map mCurObject = 1; mCurPrim = 1; mObjects = mLLSD["data"].size(); mPrims = 0; mRezCount = 0; updateImportNumbers(); for (LLSD::array_const_iterator prim_arr_it = mLLSD["data"].beginArray(), prim_arr_end = mLLSD["data"].endArray(); prim_arr_it != prim_arr_end; ++prim_arr_it) { LLSD llsd2 = (*prim_arr_it)["group_body"]; for (LLSD::map_const_iterator prim_it = llsd2.beginMap(), prim_end = llsd2.endMap(); prim_it != prim_end; ++prim_it) { LLSD prim_llsd = llsd2[prim_it->first]; if (prim_llsd.has("sculpt")) { LLSculptParams sculpt; sculpt.fromLLSD(prim_llsd["sculpt"]); if ((sculpt.getSculptType() & LL_SCULPT_TYPE_MASK) != LL_SCULPT_TYPE_MESH) { LLUUID orig = sculpt.getSculptTexture(); if (mTexturesList.count(orig) == 0) { LL_INFOS() << "Found a new SCULPT texture to upload " << orig << LL_ENDL; mTexturesList.insert(orig); } } } if (prim_llsd.has("light_texture")) { LLLightImageParams lightimg; lightimg.fromLLSD(prim_llsd["light_texture"]); LLUUID t_id = lightimg.getLightTexture(); if (!is_default_texture(t_id) && mTexturesList.count(t_id) == 0) { LL_INFOS() << "Found a new light texture to upload: " << t_id << LL_ENDL; mTexturesList.insert(t_id); } } // Check both for "textures" and "texture" since the second (buggy) // case has already been seen in some exported prims XML files... LLSD& te_llsd = prim_llsd.has("textures") ? prim_llsd["textures"] : prim_llsd["texture"]; for (LLSD::array_iterator it = te_llsd.beginArray(); it != te_llsd.endArray(); ++it) { LLSD the_te = *it; LLTextureEntry te; te.fromLLSD(the_te); LLUUID t_id = te.getID(); if (!is_default_texture(t_id) && mTexturesList.count(t_id) == 0) { LL_INFOS() << "Found a new texture to upload: " << t_id << LL_ENDL; mTexturesList.insert(t_id); } } if (prim_llsd.has("materials")) { LLSD mat_llsd = prim_llsd["materials"]; for (LLSD::array_iterator it = mat_llsd.beginArray(); it != mat_llsd.endArray(); ++it) { LLSD the_mat = *it; LLMaterial mat; mat.fromLLSD(the_mat); LLUUID t_id = mat.getNormalID(); if (!is_default_texture(t_id) && mTexturesList.count(t_id) == 0) { LL_INFOS() << "Found a new normal map to upload: " << t_id << LL_ENDL; mTexturesList.insert(t_id); } t_id = mat.getSpecularID(); if (!is_default_texture(t_id) && mTexturesList.count(t_id) == 0) { LL_INFOS() << "Found a new specular map to upload: " << t_id << LL_ENDL; mTexturesList.insert(t_id); } } } } } if (mRetexture) { uploadNextAsset(); } else { importFirstObject(); } }
void LLObjectBackup::importObject(bool upload) { mTexturesList.clear(); mAssetMap.clear(); mCurrentAsset = LLUUID::null; mRetexture = upload; // Open the file open dialog LLFilePicker& file_picker = LLFilePicker::instance(); if (!file_picker.getOpenFile(LLFilePicker::FFLOAD_XML)) { // User canceled save. return; } std::string file_name = file_picker.getFirstFile().c_str(); mFolder = gDirUtilp->getDirName(file_name); llifstream import_file(file_name); LLSDSerialize::fromXML(mLLSD, import_file); import_file.close(); mAgentPos = gAgent.getPositionAgent(); mAgentRot = LLQuaternion(gAgent.getAtAxis(), gAgent.getLeftAxis(), gAgent.getUpAxis()); // Get the texture map LLSD::map_const_iterator prim_it; LLSD::array_const_iterator prim_arr_it; mCurObject = 1; mCurPrim = 1; 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 incompatble 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++) { LLSD llsd2 = (*prim_arr_it)["group_body"]; for (prim_it = llsd2.beginMap(); prim_it != llsd2.endMap(); prim_it++) { LLSD prim_llsd = llsd2[prim_it->first]; LLSD::array_iterator text_it; std::list<LLUUID>::iterator iter; if (prim_llsd.has("sculpt")) { LLSculptParams* sculpt = new LLSculptParams(); sculpt->fromLLSD(prim_llsd["sculpt"]); LLUUID orig = sculpt->getSculptTexture(); bool alreadyseen = false; for (iter = mTexturesList.begin(); iter != mTexturesList.end(); iter++) { if ((*iter) == orig) alreadyseen = true; } if (alreadyseen == false) { llinfos << "Found a new SCULPT texture to upload " << orig << llendl; mTexturesList.push_back(orig); } } LLSD te_llsd = prim_llsd["textures"]; for (text_it = te_llsd.beginArray(); text_it != te_llsd.endArray(); text_it++) { LLSD the_te = (*text_it); LLTextureEntry te; te.fromLLSD(the_te); te.getID(); 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()); } } } } if (mRetexture == TRUE) uploadNextAsset(); else importFirstObject(); }