diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index e07435886a..2eacd622f7 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -770,6 +770,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 e4420bb1dc..b32b698388 100644 --- a/indra/llui/llbutton.h +++ b/indra/llui/llbutton.h @@ -207,6 +207,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 3e114add32..aa82712645 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -269,6 +269,7 @@ LLTabContainer::LLTabContainer(const LLTabContainer::Params& p) mOpenTabsOnDragAndDrop(p.open_tabs_on_drag_and_drop), mTabIconCtrlPad(p.tab_icon_ctrl_pad), mUseTabEllipses(p.use_ellipses), + mEnableTabsFlashing(p.enable_tabs_flashing), mDropShadowedText(p.label_shadow) // support for drop shadowed tab labels -Zi { // AO: Treat the IM tab container specially @@ -1806,6 +1807,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 73cf22079a..e61c5b49c1 100644 --- a/indra/llui/lltabcontainer.h +++ b/indra/llui/lltabcontainer.h @@ -125,7 +125,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; @@ -220,6 +220,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 cfb517b55f..d560e5a89e 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -272,7 +272,8 @@ LLFloaterModelUploadBase(key), mUploadBtn(NULL), mCalculateBtn(NULL), mUploadLogText(NULL), -mTabContainer(NULL) +mTabContainer(NULL), +mAvatarTabIndex(0) { sInstance = this; mLastMouseX = 0; @@ -353,6 +354,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"); @@ -445,17 +450,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); - mTabContainer->enableTabButton(index, false); + 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); - mTabContainer->enableTabButton(index, false); - if (LLConvexDecomposition::getInstance() != NULL) { mCalculateBtn->setClickedCallback(boost::bind(&LLFloaterModelPreview::onClickCalculateBtn, this)); @@ -691,7 +689,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"); @@ -708,14 +706,17 @@ 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 } void LLFloaterModelPreview::onDescriptionKeystroke(LLUICtrl* ctrl) @@ -1538,33 +1539,34 @@ 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(); mSelectedJointName.clear(); for (U32 i = 0; i < LLModel::NUM_LODS; ++i) { mJointOverrides[i].clear(); } + + 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)); + + + 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::resetOverridesTab() -{ - clearOverridesTab(); - - for (U32 i = 0; i < LLModel::NUM_LODS; ++i) - { - mJointOverrides[i].clear(); - } -} - -void LLFloaterModelPreview::showOverridesTab() +void LLFloaterModelPreview::updateAvatarTab() { S32 display_lod = mModelPreview->mPreviewLOD; if (mModelPreview->mModel[display_lod].empty()) { + mSelectedJointName.clear(); return; } @@ -1606,14 +1608,16 @@ void LLFloaterModelPreview::showOverridesTab() } } - LLPanel *panel = mTabContainer->getPanelByName("overrides_panel"); - S32 index = mTabContainer->getIndexForPanel(panel); - mTabContainer->enableTabButton(index, true); + LLPanel *panel = mTabContainer->getPanelByName("avatar_panel"); LLScrollListCtrl *joints_list = panel->getChild("joints_list"); 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(); @@ -1627,8 +1631,14 @@ void LLFloaterModelPreview::showOverridesTab() 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++; } @@ -1639,20 +1649,18 @@ void LLFloaterModelPreview::showOverridesTab() joint_iter++; } joints_list->selectFirstItem(); + LLScrollListItem *selected = joints_list->getFirstSelected(); + if (selected) + { + mSelectedJointName = selected->getValue().asString(); + } - 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())); } } -void LLFloaterModelPreview::hideOverridesTab() -{ - LLPanel *panel = mTabContainer->getPanelByName("overrides_panel"); - S32 index = mTabContainer->getIndexForPanel(panel); - mTabContainer->enableTabButton(index, false); -} - //----------------------------------------------------------------------------- // addStringToLogTab() //----------------------------------------------------------------------------- @@ -1672,8 +1680,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(); @@ -1686,7 +1692,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); } } @@ -2594,8 +2603,7 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod) } else { - fmp->resetOverridesTab(); - fmp->hideOverridesTab(); + fmp->clearAvatarTab(); } if (lock_scale_if_joint_position) @@ -2738,6 +2746,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(); @@ -4543,7 +4555,7 @@ BOOL LLModelPreview::render() mFMP->childEnable("lock_scale_if_joint_position"); if (fmp) { - fmp->showOverridesTab(); + fmp->updateAvatarTab(); } } else @@ -4552,7 +4564,7 @@ BOOL LLModelPreview::render() mFMP->childSetValue("lock_scale_if_joint_position", false); if (fmp) { - fmp->hideOverridesTab(); + fmp->clearAvatarTab(); } } @@ -5114,7 +5126,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(); @@ -5205,7 +5224,7 @@ void LLModelPreview::setPreviewLOD(S32 lod) if (fmp) { // make preview repopulate tab - fmp->clearOverridesTab(); + fmp->clearAvatarTab(); } } refresh(); @@ -5228,7 +5247,7 @@ void LLFloaterModelPreview::onReset(void* user_data) LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) user_data; fmp->childDisable("reset_btn"); fmp->clearLogTab(); - fmp->resetOverridesTab(); + 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 e12d8ec700..a69a9f6812 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -108,10 +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 resetOverridesTab(); // clears table and cleans all data - void showOverridesTab(); // populates table and data as nessesary - void hideOverridesTab(); + 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); @@ -251,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 18f818c9a3..4dcc08380f 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1700,13 +1700,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); @@ -1733,7 +1736,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.f; + 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; @@ -1754,7 +1768,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 48f39ab363..b51a97de63 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -467,7 +467,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/de/floater_model_preview.xml b/indra/newview/skins/default/xui/de/floater_model_preview.xml index 4d4f977bfc..9fea9201a7 100644 --- a/indra/newview/skins/default/xui/de/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/de/floater_model_preview.xml @@ -292,6 +292,19 @@ + + Skalierung (1=keine): + + + + Dimensionen: + + + [X] X [Y] X [Z] + + + + Skalierung (1=keine): @@ -306,15 +319,9 @@ Nur für Avatarmodelle: - - - Zu viele skingewichtete Gelenke - - - Modell hat unbekannte Gelenke - - - + + + @@ -325,8 +332,29 @@ Z-Offset (Av. anheben / senken): - - + + Zu viele skingewichtete Gelenke + + + Modell hat unbekannte Gelenke + + + Gelenke: + + + [CONFLICTS] Konflikte in [JOINTS_COUNT] Gelenk(e) + + + Position übersteuert für Gelenk '[JOINT]': + + + + + + + + + Hinweis: Zu viele Objekte nutzen unnötigerweise den Standard-Anhängepunkt (Rechte Hand). @@ -387,56 +415,42 @@ Mesh: Analysiert: - - - - Vorschau-Einstellungen: - - - - Hoch - - - Mittel - - - Niedrig - - - Niedrigste - - - - - Anzeige... - - - - - - - - - Vorschaudehnung: - - - HINWEIS: - Sie haben keine Berechtigung zum Hochladen von Netzmodellen. [[VURL] Weitere Infos], wie Sie sich zertifizieren lassen können. + Sie haben keine Berechtigung zum Hochladen von Netzmodellen. [[VURL] Infos] zur Zertifizierung. [STATUS] + + Vorschau: + - - Vorschau: + + Hoch + Mittel + Niedrig + Niedrigstes + + + Vorschaudehnung: + + + Anzeigen: + + + + + + + + + + Vorschaudehnung: - - 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 cf261e3d3b..b6f19cc8e5 100644 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -4,8 +4,8 @@ can_drag_on_left="false" can_minimize="true" can_resize="true" - height="575" - min_height="600" + height="590" + min_height="590" width="960" min_width="960" name="Model Preview" @@ -43,11 +43,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 + width="635"> - - - For avatar models only: - - - - Too many skinned joints - - - Model has an unknown joint(s) - - - - - Z offset (raise or lower avatar): - - - - - Tip: -Too many items use the default (right hand) unnecessarily. - -Please consider using an attachment point close to the item's position on the body. - - + name="avatar_panel" + title="Avatar"> + + + + + Z offset (raise or lower avatar): + + + + Too many skinned joints + + + Model has an unknown joint(s) + + top="73" + width="150"> Joints: + width="205"/> + width="205"> [CONFLICTS] conflicts in [JOINTS_COUNT] joints Position overrides for joint '[JOINT]': @@ -1339,24 +1304,48 @@ Please consider using an attachment point close to the item's position on the bo 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" /> + + + Tip: +Too many items use the default (right hand) unnecessarily. + +Please consider using an attachment point close to the item's position on the body. + + --> - - - - Preview controls - - - High - Medium - Low - Lowest - - - - - - - - - Explode hulls - - - - - NOTE: @@ -1757,11 +1639,16 @@ Analysed: parse_urls="true" top_delta="0" wrap="true" - width="462" - visible="false"> + width="530" + visible="true"> You dont have rights to upload mesh models. [[VURL] Find out how] to get certified. - + [STATUS] @@ -1813,10 +1700,10 @@ Analysed: layout="topleft" text_color="White" top="5" - left_pad="20" + left_pad="10" name="label_display" - width="50"> - Display... + width="100"> + Display: @@ -1867,7 +1754,7 @@ Analysed: label_text.text_color="White" layout="topleft" name="show_joint_positions" - top_pad="17"> + top_pad="8"> + width="448" + enable_tabs_flashing="true"/>