From 8ba0baa63109d5e45c1f3cfd75c7d230ff99031f Mon Sep 17 00:00:00 2001 From: Xiaohong Bao Date: Wed, 22 Dec 2010 10:55:48 -0700 Subject: fix for SH-648: Crash on exit in LLViewerFetchedTexture (ref count error) --- indra/newview/llappviewer.cpp | 1 + indra/newview/llfloatermodelpreview.cpp | 8 ++++---- indra/newview/llfloatermodelpreview.h | 2 +- indra/newview/llmeshrepository.cpp | 25 +++++++++++++++++++++---- indra/newview/llmeshrepository.h | 6 ++++-- 5 files changed, 31 insertions(+), 11 deletions(-) (limited to 'indra') diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 08f5cb4685..0ff4336f4c 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1262,6 +1262,7 @@ bool LLAppViewer::mainLoop() break; } } + gMeshRepo.update() ; if(!total_work_pending) //pause texture fetching threads if nothing to process. { diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 85d0ae02cf..cc4359a1bf 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -475,10 +475,10 @@ void LLFloaterModelPreview::onPreviewLODCommit(LLUICtrl* ctrl, void* userdata) S32 which_mode = 0; - LLComboBox* combo = (LLComboBox*) ctrl; - - which_mode = (NUM_LOD-1)-combo->getFirstSelectedIndex(); // combo box list of lods is in reverse order - + LLComboBox* combo = (LLComboBox*) ctrl; + + which_mode = (NUM_LOD-1)-combo->getFirstSelectedIndex(); // combo box list of lods is in reverse order + fp->mModelPreview->setPreviewLOD(which_mode); } diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index 64b220d86b..623cd286fb 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -52,7 +52,7 @@ class domTranslate; class LLMenuButton; class LLToggleableMenu; -const S32 NUM_LOD = 4; +const S32 NUM_LOD = 4; class LLModelLoader : public LLThread { diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 4873eaeabd..2815054865 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -1486,7 +1486,7 @@ void LLMeshUploadThread::run() { textures.insert(material_iter->mDiffuseMap); - LLTextureUploadData data(material_iter->mDiffuseMap, material_iter->mDiffuseMapLabel); + LLTextureUploadData data(material_iter->mDiffuseMap.get(), material_iter->mDiffuseMapLabel); uploadTexture(data); } } @@ -2135,6 +2135,24 @@ void LLMeshRepository::shutdown() LLConvexDecomposition::quitSystem(); } +//called in the main thread. +S32 LLMeshRepository::update() +{ + if(mUploadWaitList.empty()) + { + return 0 ; + } + + S32 size = mUploadWaitList.size() ; + for (S32 i = 0; i < size; ++i) + { + mUploads.push_back(mUploadWaitList[i]); + mUploadWaitList[i]->start() ; + } + mUploadWaitList.clear() ; + + return size ; +} S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_params, S32 detail) { @@ -2654,8 +2672,7 @@ void LLMeshRepository::uploadModel(std::vector& data, LLVector3 bool upload_skin, bool upload_joints) { LLMeshUploadThread* thread = new LLMeshUploadThread(data, scale, upload_textures, upload_skin, upload_joints); - mUploads.push_back(thread); - thread->start(); + mUploadWaitList.push_back(thread); } S32 LLMeshRepository::getMeshSize(const LLUUID& mesh_id, S32 lod) @@ -2742,7 +2759,7 @@ void LLMeshUploadThread::sendCostRequest(LLMeshUploadData& data) void LLMeshUploadThread::sendCostRequest(LLTextureUploadData& data) { - if (data.mTexture.notNull() && data.mTexture->getDiscardLevel() >= 0) + if (data.mTexture && data.mTexture->getDiscardLevel() >= 0) { LLSD asset_resources = LLSD::emptyMap(); diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index 8687ac750b..0926a94ec2 100644 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -65,7 +65,7 @@ public: class LLTextureUploadData { public: - LLPointer mTexture; + LLViewerFetchedTexture* mTexture; LLUUID mUUID; std::string mRSVP; std::string mLabel; @@ -399,7 +399,7 @@ public: std::queue mTextureQ; std::queue mConfirmedTextureQ; - std::map, LLTextureUploadData> mTextureMap; + std::map mTextureMap; LLMeshUploadThread(instance_list& data, LLVector3& scale, bool upload_textures, bool upload_skin, bool upload_joints); @@ -442,6 +442,7 @@ public: void init(); void shutdown(); + S32 update() ; //mesh management functions S32 loadMesh(LLVOVolume* volume, const LLVolumeParams& mesh_params, S32 detail = 0); @@ -505,6 +506,7 @@ public: LLMeshRepoThread* mThread; std::vector mUploads; + std::vector mUploadWaitList; LLPhysicsDecomp* mDecompThread; -- cgit v1.2.3 From 07d3480ec35a9a5bade25acb99fc39935bad38a2 Mon Sep 17 00:00:00 2001 From: Dave Parks Date: Wed, 22 Dec 2010 15:18:55 -0600 Subject: SH-658 Preserve LOD mode when switching between preview LoDs. --- indra/newview/llfloatermodelpreview.cpp | 143 ++++++++++++++++++-------------- indra/newview/llfloatermodelpreview.h | 10 ++- 2 files changed, 87 insertions(+), 66 deletions(-) (limited to 'indra') diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 1050e86060..39af84cfa0 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -89,6 +89,7 @@ #include "llstring.h" #include "llbutton.h" #include "llcheckboxctrl.h" +#include "llradiogroup.h" #include "llsliderctrl.h" #include "llspinctrl.h" #include "lltoggleablemenu.h" @@ -257,6 +258,12 @@ LLFloater(key) mLastMouseY = 0; mGLName = 0; mStatusLock = new LLMutex(NULL); + + mLODMode[LLModel::LOD_HIGH] = 0; + for (U32 i = 0; i < LLModel::LOD_HIGH; i++) + { + mLODMode[i] = 1; + } } //----------------------------------------------------------------------------- @@ -3309,84 +3316,87 @@ void LLModelPreview::updateStatusMessages() }; const U32 num_file_controls = sizeof(file_controls)/sizeof(char*); - //enable/disable controls based on radio groups - if (mFMP->childGetValue("lod_from_file").asBoolean()) - { - for (U32 i = 0; i < num_file_controls; ++i) - { - mFMP->childEnable(file_controls[i]); - } - - for (U32 i = 0; i < num_lod_controls; ++i) - { - mFMP->childDisable(lod_controls[i]); - } - - - } - else if (mFMP->childGetValue("lod_none").asBoolean()) + if (fmp) { - for (U32 i = 0; i < num_file_controls; ++i) - { - mFMP->childDisable(file_controls[i]); - } + //enable/disable controls based on radio groups + if (mFMP->childGetValue("lod_from_file").asBoolean()) + { + fmp->mLODMode[mPreviewLOD] = 0; + for (U32 i = 0; i < num_file_controls; ++i) + { + mFMP->childEnable(file_controls[i]); + } - for (U32 i = 0; i < num_lod_controls; ++i) - { - mFMP->childDisable(lod_controls[i]); + for (U32 i = 0; i < num_lod_controls; ++i) + { + mFMP->childDisable(lod_controls[i]); + } } - - if (!mModel[mPreviewLOD].empty()) + else if (mFMP->childGetValue("lod_none").asBoolean()) { - mModel[mPreviewLOD].clear(); - mScene[mPreviewLOD].clear(); - mVertexBuffer[mPreviewLOD].clear(); + fmp->mLODMode[mPreviewLOD] = 2; + for (U32 i = 0; i < num_file_controls; ++i) + { + mFMP->childDisable(file_controls[i]); + } - //this can cause phasing issues with the UI, so reenter this function and return - updateStatusMessages(); - return; - } - - - } - else - { // auto generate, also the default case for wizard which has no radio selection - for (U32 i = 0; i < num_file_controls; ++i) - { - mFMP->childDisable(file_controls[i]); - } + for (U32 i = 0; i < num_lod_controls; ++i) + { + mFMP->childDisable(lod_controls[i]); + } - for (U32 i = 0; i < num_lod_controls; ++i) - { - mFMP->childEnable(lod_controls[i]); + if (!mModel[mPreviewLOD].empty()) + { + mModel[mPreviewLOD].clear(); + mScene[mPreviewLOD].clear(); + mVertexBuffer[mPreviewLOD].clear(); + + //this can cause phasing issues with the UI, so reenter this function and return + updateStatusMessages(); + return; + } } + else + { // auto generate, also the default case for wizard which has no radio selection + fmp->mLODMode[mPreviewLOD] = 1; - //if (threshold) - { - U32 lod_mode = 0; - LLCtrlSelectionInterface* iface = mFMP->childGetSelectionInterface("lod_mode"); - if (iface) + for (U32 i = 0; i < num_file_controls; ++i) { - lod_mode = iface->getFirstSelectedIndex(); + mFMP->childDisable(file_controls[i]); } - LLSpinCtrl* threshold = mFMP->getChild("lod_error_threshold"); - LLSpinCtrl* limit = mFMP->getChild("lod_triangle_limit"); + for (U32 i = 0; i < num_lod_controls; ++i) + { + mFMP->childEnable(lod_controls[i]); + } - limit->setMaxValue(mMaxTriangleLimit); - limit->setValue(total_tris[mPreviewLOD]); + //if (threshold) + { + U32 lod_mode = 0; + LLCtrlSelectionInterface* iface = mFMP->childGetSelectionInterface("lod_mode"); + if (iface) + { + lod_mode = iface->getFirstSelectedIndex(); + } - if (lod_mode == 0) - { - limit->setVisible(true); - threshold->setVisible(false); + LLSpinCtrl* threshold = mFMP->getChild("lod_error_threshold"); + LLSpinCtrl* limit = mFMP->getChild("lod_triangle_limit"); limit->setMaxValue(mMaxTriangleLimit); - } - else - { - limit->setVisible(false); - threshold->setVisible(true); + limit->setValue(total_tris[mPreviewLOD]); + + if (lod_mode == 0) + { + limit->setVisible(true); + threshold->setVisible(false); + + limit->setMaxValue(mMaxTriangleLimit); + } + else + { + limit->setVisible(false); + threshold->setVisible(true); + } } } } @@ -4092,6 +4102,13 @@ void LLModelPreview::setPreviewLOD(S32 lod) mFMP->childSetColor(lod_triangles_name[i], color); mFMP->childSetColor(lod_vertices_name[i], color); } + + LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance; + if (fmp) + { + LLRadioGroup* radio = fmp->getChild("lod_file_or_limit"); + radio->selectNthItem(fmp->mLODMode[mPreviewLOD]); + } } refresh(); updateStatusMessages(); diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index 8c7ab39e55..9b908eafee 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -194,9 +194,7 @@ protected: static void onPhysicsOptimize(LLUICtrl* ctrl, void* userdata); static void onPhysicsDecomposeBack(LLUICtrl* ctrl, void* userdata); static void onPhysicsSimplifyBack(LLUICtrl* ctrl, void* userdata); - - - + void draw(); void initDecompControls(); @@ -220,6 +218,12 @@ protected: //use "disabled" as false by default std::map mViewOptionDisabled; + + //store which lod mode each LOD is using + // 0 - load from file + // 1 - auto generate + // 2 - None + S32 mLODMode[4]; LLMenuButton* mViewOptionMenuButton; LLToggleableMenu* mViewOptionMenu; -- cgit v1.2.3 From b512865746bde3b6ebfa64c87a3a56f7f6214348 Mon Sep 17 00:00:00 2001 From: leyla_linden Date: Wed, 22 Dec 2010 16:50:03 -0800 Subject: added open advanced floater link --- indra/newview/llviewerfloaterreg.cpp | 26 +++++++++++++++++++++- .../skins/default/xui/en/floater_model_wizard.xml | 4 ++-- 2 files changed, 27 insertions(+), 3 deletions(-) (limited to 'indra') diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 849ac7c830..8c06eb7f5d 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -123,9 +123,33 @@ #include "llsyswellwindow.h" #include "llscriptfloater.h" #include "llfloatermodelpreview.h" +#include "llcommandhandler.h" // *NOTE: Please add files in alphabetical order to keep merges easy. +// handle secondlife:///app/floater/{NAME} URLs +class LLFloaterOpenHandler : public LLCommandHandler +{ +public: + // requires trusted browser to trigger + LLFloaterOpenHandler() : LLCommandHandler("floater", UNTRUSTED_THROTTLE) { } + + bool handle(const LLSD& params, const LLSD& query_map, + LLMediaCtrl* web) + { + if (params.size() != 1) + { + return false; + } + + const std::string floater_name = LLURI::unescape(params[0].asString()); + LLFloaterReg::showInstance(floater_name); + + return true; + } +}; + +LLFloaterOpenHandler gFloaterOpenHandler; void LLViewerFloaterReg::registerFloaters() { @@ -252,7 +276,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("upload_image", "floater_image_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build, "upload"); LLFloaterReg::add("upload_sound", "floater_sound_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build, "upload"); LLFloaterReg::add("upload_model", "floater_model_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build, "upload"); - LLFloaterReg::add("upload_model_wizard", "floater_model_wizard.xml", (LLFloaterBuildFunc)&LLFloaterReg::build, "upload"); + LLFloaterReg::add("upload_model_wizard", "floater_model_wizard.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("voice_controls", "floater_voice_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("voice_effect", "floater_voice_effect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); diff --git a/indra/newview/skins/default/xui/en/floater_model_wizard.xml b/indra/newview/skins/default/xui/en/floater_model_wizard.xml index f5eda05f1a..6a0e9d1c39 100644 --- a/indra/newview/skins/default/xui/en/floater_model_wizard.xml +++ b/indra/newview/skins/default/xui/en/floater_model_wizard.xml @@ -208,7 +208,7 @@ left="10" word_wrap="true"> Note: -Advanced users familiar with 3d content creation tools may prefer to use the Advanced Mesh Import window. +Advanced users familiar with 3d content creation tools may prefer to use the [secondlife:///app/floater/upload_model Advanced Mesh Import Window] . @@ -381,7 +381,7 @@ Advanced users familiar with 3d content creation tools may prefer to use the Adv show_text="false" top="105" width="250" /> - | | | + ' ' ' -- cgit v1.2.3 From 8204145ab1c4b8f8a509db15f61bbdd264532508 Mon Sep 17 00:00:00 2001 From: leyla_linden Date: Wed, 22 Dec 2010 18:00:40 -0800 Subject: wizard xml tweaks --- .../skins/default/xui/en/floater_model_wizard.xml | 87 +++++++++++++++------- 1 file changed, 62 insertions(+), 25 deletions(-) (limited to 'indra') diff --git a/indra/newview/skins/default/xui/en/floater_model_wizard.xml b/indra/newview/skins/default/xui/en/floater_model_wizard.xml index 6a0e9d1c39..0f8844519a 100644 --- a/indra/newview/skins/default/xui/en/floater_model_wizard.xml +++ b/indra/newview/skins/default/xui/en/floater_model_wizard.xml @@ -86,7 +86,7 @@ height="388" top_pad="0" name="choose_file_panel" - visible="true" + visible="false" width="530" left="0"> + width="85"> + text_color="White" + left_pad="19"> Model Preview: Dimensions (meters): - X: [X] | Y: [Y] | Z: [Z] + X: [X] |Y: [Y] |Z: [Z] Note: + + Advanced users familiar with 3d content creation tools may prefer to use the [secondlife:///app/floater/upload_model Advanced Mesh Import Window] . @@ -218,7 +229,7 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se height="388" top_delta="0" name="optimize_panel" - visible="false" + visible="true" width="530" left="0"> - + Model Preview: - Performance Accuracy + Performance + Faster rendering but less detailed; lowers Resource (prim) cost. + Accuracy + More detailed model but slower; increases Resource (prim) cost. - ' ' ' - + width="290" /> + ' ' ' + Resource Cost: + Upload Fee: + + Dimensions (meters): + + + X: [X] |Y: [Y] |Z: [Z] + @@ -429,7 +466,7 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se