From eaa9b152bfe9b5da44f724ddce1a2ecc86dc61bf Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 27 Mar 2020 19:05:23 +0200 Subject: [PATCH 1/5] SL-307 Implemented ability to specify color and changed flashing color --- indra/llui/llbutton.cpp | 5 +++++ indra/llui/llbutton.h | 1 + indra/llui/lltabcontainer.cpp | 11 +++++++++++ indra/llui/lltabcontainer.h | 3 ++- indra/newview/llfloatermodelpreview.cpp | 5 ++++- .../skins/default/xui/en/floater_script_debug.xml | 3 ++- 6 files changed, 25 insertions(+), 3 deletions(-) diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index 27444b7f5b..804204cce0 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -734,6 +734,11 @@ void LLButton::draw() { glow_color = highlighting_color; } + else + { + // will fade from highlight color + glow_color = flash_color; + } } } diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h index 7629ed1fea..572d36996c 100644 --- a/indra/llui/llbutton.h +++ b/indra/llui/llbutton.h @@ -205,6 +205,7 @@ public: void setFlashing( bool b, bool force_flashing = false ); BOOL getFlashing() const { return mFlashing; } LLFlashTimer* getFlashTimer() {return mFlashingTimer;} + void setFlashColor(const LLUIColor &color) { mFlashBgColor = color; }; void setHAlign( LLFontGL::HAlign align ) { mHAlign = align; } LLFontGL::HAlign getHAlign() const { return mHAlign; } diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index 2a221fc19c..750a3aff9c 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -260,6 +260,7 @@ LLTabContainer::LLTabContainer(const LLTabContainer::Params& p) mCustomIconCtrlUsed(p.use_custom_icon_ctrl), mOpenTabsOnDragAndDrop(p.open_tabs_on_drag_and_drop), mTabIconCtrlPad(p.tab_icon_ctrl_pad), + mEnableTabsFlashing(p.enable_tabs_flashing), mUseTabEllipses(p.use_ellipses) { static LLUICachedControl tabcntr_vert_tab_min_width ("UITabCntrVertTabMinWidth", 0); @@ -1641,6 +1642,16 @@ void LLTabContainer::setTabPanelFlashing(LLPanel* child, BOOL state ) } } +void LLTabContainer::setTabPanelFlashing(LLPanel* child, BOOL state, LLUIColor color) +{ + LLTabTuple* tuple = getTabByPanel(child); + if (tuple) + { + tuple->mButton->setFlashColor(color); + tuple->mButton->setFlashing(state); + } +} + void LLTabContainer::setTabImage(LLPanel* child, std::string image_name, const LLColor4& color) { LLTabTuple* tuple = getTabByPanel(child); diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h index 8f93f1c47d..5339bec3dd 100644 --- a/indra/llui/lltabcontainer.h +++ b/indra/llui/lltabcontainer.h @@ -111,7 +111,7 @@ public: Optional open_tabs_on_drag_and_drop; /** - * Open tabs on hover in drag and drop situations + * Enable tab flashing */ Optional enable_tabs_flashing; @@ -203,6 +203,7 @@ public: BOOL getTabPanelFlashing(LLPanel* child); void setTabPanelFlashing(LLPanel* child, BOOL state); + void setTabPanelFlashing(LLPanel* child, BOOL state, LLUIColor color); void setTabImage(LLPanel* child, std::string img_name, const LLColor4& color = LLColor4::white); void setTabImage(LLPanel* child, const LLUUID& img_id, const LLColor4& color = LLColor4::white); void setTabImage(LLPanel* child, LLIconCtrl* icon); diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index e694340b16..f386e9e305 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -1583,7 +1583,10 @@ void LLFloaterModelPreview::addStringToLogTab(const std::string& str, bool flash if (flash && mTabContainer->getCurrentPanel() != panel) { - mTabContainer->setTabPanelFlashing(panel, true); + // This will makes colors pale due to "glow_type = LLRender::BT_ALPHA" + // So instead of using "MenuItemFlashBgColor" added stronger color + static LLUIColor sFlashBgColor(LLColor4U(255, 99, 0)); + mTabContainer->setTabPanelFlashing(panel, true, sFlashBgColor); } } diff --git a/indra/newview/skins/default/xui/en/floater_script_debug.xml b/indra/newview/skins/default/xui/en/floater_script_debug.xml index cd88048d6b..6c49cfa1a8 100644 --- a/indra/newview/skins/default/xui/en/floater_script_debug.xml +++ b/indra/newview/skins/default/xui/en/floater_script_debug.xml @@ -17,5 +17,6 @@ name="Preview Tabs" tab_position="bottom" top="16" - width="448" /> + width="448" + enable_tabs_flashing="true"/> From 46c76eabb86fff6ca6c8352e10988b15c20ef8a6 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 30 Mar 2020 15:14:44 +0300 Subject: [PATCH 2/5] SL-379 Do not disable tabs --- indra/newview/llfloatermodelpreview.cpp | 20 +++----------------- indra/newview/llfloatermodelpreview.h | 3 +-- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index f386e9e305..d53b0c1155 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -407,13 +407,11 @@ BOOL LLFloaterModelPreview::postBuild() // Disable Overrides tab untill it has something to show and set callbacks LLPanel *panel = mTabContainer->getPanelByName("overrides_panel"); S32 index = mTabContainer->getIndexForPanel(panel); - mTabContainer->enableTabButton(index, false); panel->getChild("joints_list")->setCommitCallback(boost::bind(&LLFloaterModelPreview::onJointListSelection, this)); // Disable Logs tab untill it has something to show panel = mTabContainer->getPanelByName("logs_panel"); index = mTabContainer->getIndexForPanel(panel); - mTabContainer->enableTabButton(index, false); if (LLConvexDecomposition::getInstance() != NULL) { @@ -1459,7 +1457,7 @@ void LLFloaterModelPreview::resetOverridesTab() } } -void LLFloaterModelPreview::showOverridesTab() +void LLFloaterModelPreview::updateOverridesTab() { S32 display_lod = mModelPreview->mPreviewLOD; if (mModelPreview->mModel[display_lod].empty()) @@ -1504,8 +1502,6 @@ void LLFloaterModelPreview::showOverridesTab() } LLPanel *panel = mTabContainer->getPanelByName("overrides_panel"); - S32 index = mTabContainer->getIndexForPanel(panel); - mTabContainer->enableTabButton(index, true); LLScrollListCtrl *joints_list = panel->getChild("joints_list"); if (joints_list->isEmpty()) @@ -1543,13 +1539,6 @@ void LLFloaterModelPreview::showOverridesTab() } } -void LLFloaterModelPreview::hideOverridesTab() -{ - LLPanel *panel = mTabContainer->getPanelByName("overrides_panel"); - S32 index = mTabContainer->getIndexForPanel(panel); - mTabContainer->enableTabButton(index, false); -} - //----------------------------------------------------------------------------- // addStringToLogTab() //----------------------------------------------------------------------------- @@ -1569,8 +1558,6 @@ void LLFloaterModelPreview::addStringToLogTab(const std::string& str, bool flash } LLPanel* panel = mTabContainer->getPanelByName("logs_panel"); - S32 index = mTabContainer->getIndexForPanel(panel); - mTabContainer->enableTabButton(index, true); // Make sure we have space for new string S32 editor_text_len = mUploadLogText->getLength(); @@ -2480,7 +2467,6 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod) else { fmp->resetOverridesTab(); - fmp->hideOverridesTab(); } if (lock_scale_if_joint_position) @@ -4231,7 +4217,7 @@ BOOL LLModelPreview::render() mFMP->childEnable("lock_scale_if_joint_position"); if (fmp) { - fmp->showOverridesTab(); + fmp->updateOverridesTab(); } } else @@ -4240,7 +4226,7 @@ BOOL LLModelPreview::render() mFMP->childSetValue("lock_scale_if_joint_position", false); if (fmp) { - fmp->hideOverridesTab(); + fmp->resetOverridesTab(); } } diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index c359722431..f64a7b6feb 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -110,8 +110,7 @@ public: static void addStringToLog(const std::ostringstream& strm, bool flash); void clearOverridesTab(); // clears table void resetOverridesTab(); // clears table and cleans all data - void showOverridesTab(); // populates table and data as nessesary - void hideOverridesTab(); + void updateOverridesTab(); // populates table and data as nessesary void setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost); void setPreviewLOD(S32 lod); From acb6e12135452d8d4e53a9a61e1fb50cdeec2469 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 30 Mar 2020 16:47:54 +0300 Subject: [PATCH 3/5] SL-379 Remake Overrides tab into Avatar --- indra/newview/llfloatermodelpreview.cpp | 44 ++-- indra/newview/llfloatermodelpreview.h | 1 - .../default/xui/en/floater_model_preview.xml | 222 +++++++++--------- 3 files changed, 136 insertions(+), 131 deletions(-) diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index d53b0c1155..f99b42ab2c 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -346,6 +346,10 @@ BOOL LLFloaterModelPreview::postBuild() childSetVisible("skin_too_many_joints", false); childSetVisible("skin_unknown_joint", false); + childSetVisible("warning_title", false); + childSetVisible("warning_message", false); + childSetVisible("status", false); + initDecompControls(); LLView* preview_panel = getChild("preview_panel"); @@ -656,6 +660,7 @@ void LLFloaterModelPreview::onJointListSelection() joint_pos_descr->setTextArg("[JOINT]", label); } + // Note: We can make a version of renderBones() to highlight selected joint } void LLFloaterModelPreview::onDescriptionKeystroke(LLUICtrl* ctrl) @@ -1440,21 +1445,22 @@ void LLFloaterModelPreview::clearOverridesTab() LLPanel *panel = mTabContainer->getPanelByName("overrides_panel"); LLScrollListCtrl *joints_list = panel->getChild("joints_list"); joints_list->deleteAllItems(); + LLScrollListCtrl *joints_pos = panel->getChild("pos_overrides_list"); + joints_pos->deleteAllItems(); + for (U32 i = 0; i < LLModel::NUM_LODS; ++i) { mJointOverrides[i].clear(); } -} -void LLFloaterModelPreview::resetOverridesTab() -{ - clearOverridesTab(); + LLTextBox *joint_total_descr = panel->getChild("conflicts_description"); + joint_total_descr->setTextArg("[CONFLICTS]", llformat("%d", 0)); + joint_total_descr->setTextArg("[JOINTS_COUNT]", llformat("%d", 0)); - for (U32 i = 0; i < LLModel::NUM_LODS; ++i) - { - mJointOverrides[i].clear(); - } + + LLTextBox *joint_pos_descr = panel->getChild("pos_overrides_descr"); + joint_pos_descr->setTextArg("[JOINT]", std::string("mPelvis")); // Might be better to hide it } void LLFloaterModelPreview::updateOverridesTab() @@ -1507,6 +1513,10 @@ void LLFloaterModelPreview::updateOverridesTab() if (joints_list->isEmpty()) { // Populate table + + std::map joint_alias_map; + mModelPreview->getJointAliases(joint_alias_map); + S32 conflicts = 0; joint_override_data_map_t::iterator joint_iter = mJointOverrides[display_lod].begin(); joint_override_data_map_t::iterator joint_end = mJointOverrides[display_lod].end(); @@ -1520,8 +1530,14 @@ void LLFloaterModelPreview::updateOverridesTab() LLScrollListCell::Params cell_params; cell_params.font = LLFontGL::getFontSansSerif(); cell_params.value = listName; + if (joint_alias_map.find(listName) == joint_alias_map.end()) + { + // Missing names + cell_params.color = LLColor4::red; + } if (joint_iter->second.mHasConflicts) { + // Conflicts cell_params.color = LLColor4::orange; conflicts++; } @@ -1533,9 +1549,9 @@ void LLFloaterModelPreview::updateOverridesTab() } joints_list->selectFirstItem(); - LLTextBox *joint_pos_descr = panel->getChild("conflicts_description"); - joint_pos_descr->setTextArg("[CONFLICTS]", llformat("%d", conflicts)); - joint_pos_descr->setTextArg("[JOINTS_COUNT]", llformat("%d", mJointOverrides[display_lod].size())); + LLTextBox *joint_conf_descr = panel->getChild("conflicts_description"); + joint_conf_descr->setTextArg("[CONFLICTS]", llformat("%d", conflicts)); + joint_conf_descr->setTextArg("[JOINTS_COUNT]", llformat("%d", mJointOverrides[display_lod].size())); } } @@ -2466,7 +2482,7 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod) } else { - fmp->resetOverridesTab(); + fmp->clearOverridesTab(); } if (lock_scale_if_joint_position) @@ -4226,7 +4242,7 @@ BOOL LLModelPreview::render() mFMP->childSetValue("lock_scale_if_joint_position", false); if (fmp) { - fmp->resetOverridesTab(); + fmp->clearOverridesTab(); } } @@ -4868,7 +4884,7 @@ void LLFloaterModelPreview::onReset(void* user_data) LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) user_data; fmp->childDisable("reset_btn"); fmp->clearLogTab(); - fmp->resetOverridesTab(); + fmp->clearOverridesTab(); LLModelPreview* mp = fmp->mModelPreview; std::string filename = mp->mLODFile[LLModel::LOD_HIGH]; diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index f64a7b6feb..d079a3d782 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -109,7 +109,6 @@ public: static void addStringToLog(const std::string& str, bool flash); static void addStringToLog(const std::ostringstream& strm, bool flash); void clearOverridesTab(); // clears table - void resetOverridesTab(); // clears table and cleans all data void updateOverridesTab(); // populates table and data as nessesary void setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost); diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml index 9ebcb0c09d..053c482831 100644 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -47,12 +47,12 @@ + width="635"> + width="628" /> + width="614" /> + width="628"/> + width="628"/> - - - For avatar models only: - - - - Too many skinned joints - - - Model has an unknown joint(s) - - - - - Z offset (raise or lower avatar): - - + title="Avatar"> + width="628" /> + + + + + Z offset (raise or lower avatar): + + + + Too many skinned joints + + + Model has an unknown joint(s) + + top="73" + width="150"> Joints: @@ -1299,7 +1284,7 @@ height="15" left_pad="5" name="pos_overrides_descr" - top="4" + top="73" width="300"> Position overrides for joint '[JOINT]': @@ -1314,23 +1299,23 @@ height="100" left_delta="0" top_pad="0" - width="330"> + width="385"> + relative_width="0.49" /> + relative_width="0.17" /> + relative_width="0.17" /> + relative_width="0.17" /> + width="628" /> NOTE: @@ -1622,13 +1607,18 @@ Analysed: left_pad="1" name="warning_message" parse_urls="true" - top_delta="2" + top_delta="1" wrap="true" width="462" - visible="false"> + visible="true"> You dont have rights to upload mesh models. [[VURL] Find out how] to get certified. - + [STATUS] From aaddcc0b704f28555fbd4a1f6068f44242966295 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 30 Mar 2020 20:04:25 +0300 Subject: [PATCH 4/5] SL-307 A separator to see where model loading logs ends and other state starts --- indra/newview/llfloatermodelpreview.cpp | 4 ++++ indra/newview/skins/default/xui/en/floater_model_preview.xml | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index f99b42ab2c..b0dfe19451 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -2625,6 +2625,10 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod) { description_form->setText(model_name); } + // Add info to log that loading is complete (purpose: separator between loading and other logs) + LLSD args; + args["MODEL_NAME"] = model_name; // Teoretically shouldn't be empty, but might be better idea to add filename here + LLFloaterModelPreview::addStringToLog("ModelLoaded", args, false, loaded_lod); } } refresh(); diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml index 053c482831..aeed3b4623 100644 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -39,11 +39,11 @@ Simplifying... TBD - + Skinning disabled due to too many joints: [JOINTS], maximum: [MAX] Rigged to unrecognized joint name [NAME] Skinning disabled due to [COUNT] unknown joints - + Model [MODEL_NAME] loaded Date: Tue, 31 Mar 2020 15:40:48 +0300 Subject: [PATCH 5/5] SL-379 Render selected joint yellow when Avatar tab is open --- indra/newview/llfloatermodelpreview.cpp | 52 +++++++++++-------- indra/newview/llfloatermodelpreview.h | 7 ++- indra/newview/llvoavatar.cpp | 21 ++++++-- indra/newview/llvoavatar.h | 2 +- .../default/xui/en/floater_model_preview.xml | 2 +- 5 files changed, 55 insertions(+), 29 deletions(-) diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index b0dfe19451..2a0e51f496 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -266,7 +266,8 @@ LLFloaterModelUploadBase(key), mUploadBtn(NULL), mCalculateBtn(NULL), mUploadLogText(NULL), -mTabContainer(NULL) +mTabContainer(NULL), +mAvatarTabIndex(0) { sInstance = this; mLastMouseX = 0; @@ -408,15 +409,10 @@ BOOL LLFloaterModelPreview::postBuild() mUploadLogText = getChild("log_text"); mTabContainer = getChild("import_tab"); - // Disable Overrides tab untill it has something to show and set callbacks - LLPanel *panel = mTabContainer->getPanelByName("overrides_panel"); - S32 index = mTabContainer->getIndexForPanel(panel); + LLPanel *panel = mTabContainer->getPanelByName("avatar_panel"); + mAvatarTabIndex = mTabContainer->getIndexForPanel(panel); panel->getChild("joints_list")->setCommitCallback(boost::bind(&LLFloaterModelPreview::onJointListSelection, this)); - // Disable Logs tab untill it has something to show - panel = mTabContainer->getPanelByName("logs_panel"); - index = mTabContainer->getIndexForPanel(panel); - if (LLConvexDecomposition::getInstance() != NULL) { mCalculateBtn->setClickedCallback(boost::bind(&LLFloaterModelPreview::onClickCalculateBtn, this)); @@ -635,7 +631,7 @@ void populate_list_with_map(LLScrollListCtrl *list, const std::mapmPreviewLOD; - LLPanel *panel = mTabContainer->getPanelByName("overrides_panel"); + LLPanel *panel = mTabContainer->getPanelByName("avatar_panel"); LLScrollListCtrl *joints_list = panel->getChild("joints_list"); LLScrollListCtrl *joints_pos = panel->getChild("pos_overrides_list"); LLScrollListCtrl *joints_scale = panel->getChild("scale_overrides_list"); @@ -652,12 +648,14 @@ void LLFloaterModelPreview::onJointListSelection() populate_list_with_map(joints_pos, data.mPosOverrides); joint_pos_descr->setTextArg("[JOINT]", label); + mSelectedJointName = label; } else { // temporary value (shouldn't happen) std::string label = "mPelvis"; joint_pos_descr->setTextArg("[JOINT]", label); + mSelectedJointName.clear(); } // Note: We can make a version of renderBones() to highlight selected joint @@ -1440,14 +1438,13 @@ void LLFloaterModelPreview::addStringToLog(const std::ostringstream& strm, bool } } -void LLFloaterModelPreview::clearOverridesTab() +void LLFloaterModelPreview::clearAvatarTab() { - LLPanel *panel = mTabContainer->getPanelByName("overrides_panel"); + LLPanel *panel = mTabContainer->getPanelByName("avatar_panel"); LLScrollListCtrl *joints_list = panel->getChild("joints_list"); joints_list->deleteAllItems(); LLScrollListCtrl *joints_pos = panel->getChild("pos_overrides_list"); - joints_pos->deleteAllItems(); - + joints_pos->deleteAllItems(); mSelectedJointName.clear(); for (U32 i = 0; i < LLModel::NUM_LODS; ++i) { @@ -1463,11 +1460,12 @@ void LLFloaterModelPreview::clearOverridesTab() joint_pos_descr->setTextArg("[JOINT]", std::string("mPelvis")); // Might be better to hide it } -void LLFloaterModelPreview::updateOverridesTab() +void LLFloaterModelPreview::updateAvatarTab() { S32 display_lod = mModelPreview->mPreviewLOD; if (mModelPreview->mModel[display_lod].empty()) { + mSelectedJointName.clear(); return; } @@ -1507,7 +1505,7 @@ void LLFloaterModelPreview::updateOverridesTab() } } - LLPanel *panel = mTabContainer->getPanelByName("overrides_panel"); + LLPanel *panel = mTabContainer->getPanelByName("avatar_panel"); LLScrollListCtrl *joints_list = panel->getChild("joints_list"); if (joints_list->isEmpty()) @@ -1548,6 +1546,11 @@ void LLFloaterModelPreview::updateOverridesTab() joint_iter++; } joints_list->selectFirstItem(); + LLScrollListItem *selected = joints_list->getFirstSelected(); + if (selected) + { + mSelectedJointName = selected->getValue().asString(); + } LLTextBox *joint_conf_descr = panel->getChild("conflicts_description"); joint_conf_descr->setTextArg("[CONFLICTS]", llformat("%d", conflicts)); @@ -2482,7 +2485,7 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod) } else { - fmp->clearOverridesTab(); + fmp->clearAvatarTab(); } if (lock_scale_if_joint_position) @@ -4237,7 +4240,7 @@ BOOL LLModelPreview::render() mFMP->childEnable("lock_scale_if_joint_position"); if (fmp) { - fmp->updateOverridesTab(); + fmp->updateAvatarTab(); } } else @@ -4246,7 +4249,7 @@ BOOL LLModelPreview::render() mFMP->childSetValue("lock_scale_if_joint_position", false); if (fmp) { - fmp->clearOverridesTab(); + fmp->clearAvatarTab(); } } @@ -4774,7 +4777,14 @@ BOOL LLModelPreview::render() gDebugProgram.bind(); } getPreviewAvatar()->renderCollisionVolumes(); - getPreviewAvatar()->renderBones(); + if (fmp->mTabContainer->getCurrentPanelIndex() == fmp->mAvatarTabIndex) + { + getPreviewAvatar()->renderBones(fmp->mSelectedJointName); + } + else + { + getPreviewAvatar()->renderBones(); + } if (shader) { shader->bind(); @@ -4865,7 +4875,7 @@ void LLModelPreview::setPreviewLOD(S32 lod) if (fmp) { // make preview repopulate tab - fmp->clearOverridesTab(); + fmp->clearAvatarTab(); } } refresh(); @@ -4888,7 +4898,7 @@ void LLFloaterModelPreview::onReset(void* user_data) LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) user_data; fmp->childDisable("reset_btn"); fmp->clearLogTab(); - fmp->clearOverridesTab(); + fmp->clearAvatarTab(); LLModelPreview* mp = fmp->mModelPreview; std::string filename = mp->mLODFile[LLModel::LOD_HIGH]; diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index d079a3d782..1542e97160 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -108,8 +108,8 @@ public: static void addStringToLog(const std::string& message, const LLSD& args, bool flash, S32 lod = -1); static void addStringToLog(const std::string& str, bool flash); static void addStringToLog(const std::ostringstream& strm, bool flash); - void clearOverridesTab(); // clears table - void updateOverridesTab(); // populates table and data as nessesary + void clearAvatarTab(); // clears table + void updateAvatarTab(); // populates table and data as nessesary void setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost); void setPreviewLOD(S32 lod); @@ -249,6 +249,9 @@ private: LLViewerTextEditor* mUploadLogText; LLTabContainer* mTabContainer; + S32 mAvatarTabIndex; // just to avoid any issues in case of xml changes + std::string mSelectedJointName; + joint_override_data_map_t mJointOverrides[LLModel::NUM_LODS]; }; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index b524db478e..32e6535465 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1574,13 +1574,16 @@ void LLVOAvatar::renderCollisionVolumes() } } -void LLVOAvatar::renderBones() +void LLVOAvatar::renderBones(const std::string &selected_joint) { LLGLEnable blend(GL_BLEND); avatar_joint_list_t::iterator iter = mSkeleton.begin(); - avatar_joint_list_t::iterator end = mSkeleton.end(); + avatar_joint_list_t::iterator end = mSkeleton.end(); + // For selected joints + static LLVector3 SELECTED_COLOR_OCCLUDED(1.0f, 1.0f, 0.0f); + static LLVector3 SELECTED_COLOR_VISIBLE(0.5f, 0.5f, 0.5f); // For bones with position overrides defined static LLVector3 OVERRIDE_COLOR_OCCLUDED(1.0f, 0.0f, 0.0f); static LLVector3 OVERRIDE_COLOR_VISIBLE(0.5f, 0.5f, 0.5f); @@ -1607,7 +1610,18 @@ void LLVOAvatar::renderBones() LLVector3 pos; LLUUID mesh_id; - if (jointp->hasAttachmentPosOverride(pos,mesh_id)) + F32 sphere_scale = SPHERE_SCALEF; + + // We are in render, so it is preferable to implement selection + // in a different way, but since this is for debug/preview, this + // is low priority + if (jointp->getName() == selected_joint) + { + sphere_scale *= 16; + occ_color = SELECTED_COLOR_OCCLUDED; + visible_color = SELECTED_COLOR_VISIBLE; + } + else if (jointp->hasAttachmentPosOverride(pos,mesh_id)) { occ_color = OVERRIDE_COLOR_OCCLUDED; visible_color = OVERRIDE_COLOR_VISIBLE; @@ -1628,7 +1642,6 @@ void LLVOAvatar::renderBones() LLVector3 begin_pos(0,0,0); LLVector3 end_pos(jointp->getEnd()); - F32 sphere_scale = SPHERE_SCALEF; gGL.pushMatrix(); gGL.multMatrix( &jointp->getXform()->getWorldMatrix().mMatrix[0][0] ); diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 00dccc5d12..f19bdb3071 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -443,7 +443,7 @@ public: F32 getLastSkinTime() { return mLastSkinTime; } U32 renderTransparent(BOOL first_pass); void renderCollisionVolumes(); - void renderBones(); + void renderBones(const std::string &selected_joint = std::string()); void renderJoints(); static void deleteCachedImages(bool clearAll=true); static void destroyGL(); diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml index aeed3b4623..da4190c4fc 100644 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -1169,7 +1169,7 @@