Merge DRTVWR-482

master
Ansariel 2020-01-29 17:22:18 +01:00
commit ee65b14ec8
11 changed files with 384 additions and 23 deletions

View File

@ -532,7 +532,7 @@ void LLJoint::clearAttachmentPosOverrides()
// getAllAttachmentPosOverrides()
//--------------------------------------------------------------------
void LLJoint::getAllAttachmentPosOverrides(S32& num_pos_overrides,
std::set<LLVector3>& distinct_pos_overrides)
std::set<LLVector3>& distinct_pos_overrides) const
{
num_pos_overrides = m_attachmentPosOverrides.count();
LLVector3OverrideMap::map_type::const_iterator it = m_attachmentPosOverrides.getMap().begin();
@ -546,7 +546,7 @@ void LLJoint::getAllAttachmentPosOverrides(S32& num_pos_overrides,
// getAllAttachmentScaleOverrides()
//--------------------------------------------------------------------
void LLJoint::getAllAttachmentScaleOverrides(S32& num_scale_overrides,
std::set<LLVector3>& distinct_scale_overrides)
std::set<LLVector3>& distinct_scale_overrides) const
{
num_scale_overrides = m_attachmentScaleOverrides.count();
LLVector3OverrideMap::map_type::const_iterator it = m_attachmentScaleOverrides.getMap().begin();

View File

@ -313,9 +313,9 @@ public:
void showAttachmentScaleOverrides(const std::string& av_info) const;
void getAllAttachmentPosOverrides(S32& num_pos_overrides,
std::set<LLVector3>& distinct_pos_overrides);
std::set<LLVector3>& distinct_pos_overrides) const;
void getAllAttachmentScaleOverrides(S32& num_scale_overrides,
std::set<LLVector3>& distinct_scale_overrides);
std::set<LLVector3>& distinct_scale_overrides) const;
// These are used in checks of whether a pos/scale override is considered significant.
bool aboveJointPosThreshold(const LLVector3& pos) const;

View File

@ -136,6 +136,7 @@ LLScrollListCtrl::Params::Params()
primary_sort_only("primary_sort_only", false), // <FS:Ansariel> Option to only sort by one column
mouse_wheel_opaque("mouse_wheel_opaque", false),
commit_on_keyboard_movement("commit_on_keyboard_movement", true),
commit_on_selection_change("commit_on_selection_change", false),
heading_height("heading_height"),
page_lines("page_lines", 0),
background_visible("background_visible"),
@ -165,7 +166,7 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p)
mMaxSelectable(0),
mAllowKeyboardMovement(true),
mCommitOnKeyboardMovement(p.commit_on_keyboard_movement),
mCommitOnSelectionChange(false),
mCommitOnSelectionChange(p.commit_on_selection_change),
mSelectionChanged(false),
mNeedsScroll(false),
mCanSelect(true),

View File

@ -97,6 +97,7 @@ public:
// behavioral flags
Optional<bool> multi_select,
commit_on_keyboard_movement,
commit_on_selection_change,
mouse_wheel_opaque;
// display flags

View File

@ -1248,6 +1248,7 @@ set(viewer_HEADER_FILES
llinventorymodelbackgroundfetch.h
llinventoryobserver.h
llinventorypanel.h
lljointoverridedata.h
lljoystickbutton.h
lllandmarkactions.h
lllandmarklist.h

View File

@ -445,9 +445,15 @@ BOOL LLFloaterModelPreview::postBuild()
mUploadLogText = getChild<LLViewerTextEditor>("log_text");
mTabContainer = getChild<LLTabContainer>("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);
panel->getChild<LLScrollListCtrl>("joints_list")->setCommitCallback(boost::bind(&LLFloaterModelPreview::onJointListSelection, this));
// Disable Logs tab untill it has something to show
LLPanel* panel = mTabContainer->getPanelByName("logs_panel");
S32 index = mTabContainer->getIndexForPanel(panel);
panel = mTabContainer->getPanelByName("logs_panel");
index = mTabContainer->getIndexForPanel(panel);
mTabContainer->enableTabButton(index, false);
if (LLConvexDecomposition::getInstance() != NULL)
@ -621,9 +627,12 @@ void LLFloaterModelPreview::onClickCalculateBtn()
if (upload_joint_positions)
{
// Diagnostic message showing list of joints for which joint offsets are defined.
// FIXME - given time, would be much better to put this in the UI, in updateStatusMessages().
mModelPreview->getPreviewAvatar()->showAttachmentOverrides();
// Todo: this probably should be enabled when checkbox enables, not on calculate
populateOverridesTab();
}
else
{
disableOverridesTab();
}
mUploadModelUrl.clear();
@ -639,6 +648,89 @@ void LLFloaterModelPreview::onClickCalculateBtn()
mUploadBtn->setEnabled(false);
}
void populate_list_with_vectors(LLScrollListCtrl *list, const std::set<LLVector3> &vector_set, const LLVector3 &active)
{
if (vector_set.empty())
{
return;
}
S32 count = 0;
LLScrollListCell::Params cell_params;
cell_params.font = LLFontGL::getFontSansSerif();
// Start out right justifying numeric displays
cell_params.font_halign = LLFontGL::HCENTER;
std::set<LLVector3>::const_iterator iter = vector_set.begin();
std::set<LLVector3>::const_iterator end = vector_set.end();
while (iter != end)
{
LLScrollListItem::Params item_params;
item_params.value = LLSD::Integer(count);
cell_params.column = "override";
if (*iter != active)
{
cell_params.value = "";
}
else
{
cell_params.value = "active"; //todo: localize
}
item_params.columns.add(cell_params);
cell_params.column = "axis_x";
cell_params.value = iter->mV[VX];
item_params.columns.add(cell_params);
cell_params.column = "axis_y";
cell_params.value = iter->mV[VY];
item_params.columns.add(cell_params);
cell_params.column = "axis_z";
cell_params.value = iter->mV[VZ];
item_params.columns.add(cell_params);
list->addRow(item_params);
count++;
iter++;
}
}
void LLFloaterModelPreview::onJointListSelection()
{
LLPanel *panel = mTabContainer->getPanelByName("overrides_panel");
LLScrollListCtrl *joints_list = panel->getChild<LLScrollListCtrl>("joints_list");
LLScrollListCtrl *joints_pos = panel->getChild<LLScrollListCtrl>("pos_overrides_list");
LLScrollListCtrl *joints_scale = panel->getChild<LLScrollListCtrl>("scale_overrides_list");
LLTextBox *joint_pos_descr = panel->getChild<LLTextBox>("pos_overrides_descr");
LLTextBox *joint_scale_descr = panel->getChild<LLTextBox>("scale_overrides_descr");
joints_pos->deleteAllItems();
joints_scale->deleteAllItems();
LLScrollListItem *selected = joints_list->getFirstSelected();
if (selected)
{
std::string label = selected->getValue().asString();
LLJointOverrideData *data = &mJointOverrides[label];
populate_list_with_vectors(joints_pos, data->mPosOverrides, data->mActivePosOverride);
populate_list_with_vectors(joints_scale, data->mScaleOverrides, data->mActiveScaleOverride);
joint_pos_descr->setTextArg("[JOINT]", label);
joint_scale_descr->setTextArg("[JOINT]", label);
}
else
{
// temporary value (shouldn't happen)
std::string label = "mPelvis";
joint_pos_descr->setTextArg("[JOINT]", label);
joint_scale_descr->setTextArg("[JOINT]", label);
}
}
void LLFloaterModelPreview::onDescriptionKeystroke(LLUICtrl* ctrl)
{
// Workaround for SL-4186, server doesn't allow name changes after 'calculate' stage
@ -4183,7 +4275,7 @@ void LLModelPreview::addEmptyFace( LLModel* pTarget )
pTarget->setNumVolumeFaces( faceCnt+1 );
pTarget->setVolumeFaceData( faceCnt+1, pos, norm, tc, index, buff->getNumVerts(), buff->getNumIndices() );
}
}
//-----------------------------------------------------------------------------
// render()
@ -5180,6 +5272,43 @@ void LLFloaterModelPreview::clearLogTab()
mTabContainer->setTabPanelFlashing(panel, false);
}
void LLFloaterModelPreview::populateOverridesTab()
{
mJointOverrides.clear();
attach_override_data_map_t attach_not_in_use;
mModelPreview->getPreviewAvatar()->getAttachmentOverrides(mJointOverrides, attach_not_in_use);
if (mJointOverrides.empty())
{
disableOverridesTab();
return;
}
LLPanel *panel = mTabContainer->getPanelByName("overrides_panel");
S32 index = mTabContainer->getIndexForPanel(panel);
mTabContainer->enableTabButton(index, true);
LLScrollListCtrl *joints_list = panel->getChild<LLScrollListCtrl>("joints_list");
joints_list->deleteAllItems();
joint_override_data_map_t::iterator joint_iter = mJointOverrides.begin();
joint_override_data_map_t::iterator joint_end = mJointOverrides.end();
while (joint_iter != joint_end)
{
const std::string& listName = joint_iter->first;
joints_list->addSimpleElement(listName);
joint_iter++;
}
joints_list->selectFirstItem();
}
void LLFloaterModelPreview::disableOverridesTab()
{
LLPanel *panel = mTabContainer->getPanelByName("overrides_panel");
S32 index = mTabContainer->getIndexForPanel(panel);
mTabContainer->enableTabButton(index, false);
}
void LLFloaterModelPreview::onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url)
{
mModelPhysicsFee = result;

View File

@ -30,6 +30,7 @@
#include "llfloaternamedesc.h"
#include "lldynamictexture.h"
#include "lljointoverridedata.h"
#include "llquaternion.h"
#include "llmeshrepository.h"
#include "llmodel.h"
@ -213,7 +214,8 @@ protected:
LLSD mModelPhysicsFee;
private:
void onClickCalculateBtn();
void onClickCalculateBtn();
void onJointListSelection();
void onLoDSourceCommit(S32 lod);
@ -227,6 +229,8 @@ private:
void resetUploadOptions();
void clearLogTab();
void populateOverridesTab();
void disableOverridesTab();
void createSmoothComboBox(LLComboBox* combo_box, float min, float max);
@ -234,6 +238,8 @@ private:
LLButton* mCalculateBtn;
LLViewerTextEditor* mUploadLogText;
LLTabContainer* mTabContainer;
joint_override_data_map_t mJointOverrides;
};
class LLMeshFilePicker : public LLFilePickerThread

View File

@ -0,0 +1,53 @@
/**
* @file lljointoverridedata.h
* @brief Declaration of LLJointOverrideData and LLAttachmentOverrideData
*
* $LicenseInfo:firstyear=2020&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2020, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LL_JOINTOVERRIDEDATA_H
#define LL_JOINTOVERRIDEDATA_H
//#include <map>
//#include <string>
//#include <vector>
struct LLJointOverrideData
{
std::set<LLVector3> mPosOverrides;
LLVector3 mActivePosOverride;
std::set<LLVector3> mScaleOverrides;
LLVector3 mActiveScaleOverride;
};
struct LLAttachmentOverrideData
{
std::set<LLVector3> mPosOverrides;
LLVector3 mActivePosOverride;
};
typedef std::map<std::string, LLJointOverrideData> joint_override_data_map_t;
typedef std::map<std::string, LLAttachmentOverrideData> attach_override_data_map_t;
#endif // LL_JOINTOVERRIDEDATA_H

View File

@ -7198,6 +7198,56 @@ void LLVOAvatar::showAttachmentOverrides(bool verbose) const
}
}
//-----------------------------------------------------------------------------
// getAttachmentOverrides
//-----------------------------------------------------------------------------
void LLVOAvatar::getAttachmentOverrides(joint_override_data_map_t &joint_overrides, attach_override_data_map_t &attach_overrides) const
{
LLVector3 pos, scale;
LLUUID mesh_id;
S32 count = 0;
// Bones
for (avatar_joint_list_t::const_iterator iter = mSkeleton.begin();
iter != mSkeleton.end(); ++iter)
{
const LLJoint* pJoint = (*iter);
LLJointOverrideData data;
bool joint_override = false;
if (pJoint && pJoint->hasAttachmentPosOverride(pos, mesh_id))
{
pJoint->getAllAttachmentPosOverrides(count, data.mPosOverrides);
data.mActivePosOverride = pos;
joint_override = true;
}
if (pJoint && pJoint->hasAttachmentScaleOverride(scale, mesh_id))
{
pJoint->getAllAttachmentScaleOverrides(count, data.mPosOverrides);
data.mActiveScaleOverride = scale;
joint_override = true;
}
if (joint_override)
{
joint_overrides[pJoint->getName()] = data;
}
}
// Attachment points
for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin();
iter != mAttachmentPoints.end();
++iter)
{
const LLViewerJointAttachment *attachment_pt = (*iter).second;
if (attachment_pt && attachment_pt->hasAttachmentPosOverride(pos, mesh_id))
{
LLAttachmentOverrideData data;
attachment_pt->getAllAttachmentPosOverrides(count, data.mPosOverrides);
data.mActivePosOverride = pos;
attach_overrides[attachment_pt->getName()] = data;
}
}
}
//-----------------------------------------------------------------------------
// removeAttachmentOverridesForObject
//-----------------------------------------------------------------------------

View File

@ -36,23 +36,25 @@
#include <boost/signals2/trackable.hpp>
#include "llavatarappearance.h"
#include "llavatarappearancedefines.h"
#include "llavatarrendernotifier.h"
#include "llcontrol.h"
#include "llcharacter.h"
#include "llchat.h"
#include "lldrawpoolalpha.h"
#include "llviewerobject.h"
#include "llcharacter.h"
#include "llcontrol.h"
#include "lldriverparam.h"
#include "lljointoverridedata.h"
#include "llrendertarget.h"
#include "llrigginginfo.h"
#include "lltexglobalcolor.h"
#include "llviewerjointmesh.h"
#include "llviewerjointattachment.h"
#include "llrendertarget.h"
#include "llavatarappearancedefines.h"
#include "lltexglobalcolor.h"
#include "lldriverparam.h"
#include "llviewertexlayer.h"
#include "material_codes.h" // LL_MCODE_END
#include "llrigginginfo.h"
#include "llviewerobject.h"
#include "llviewerstats.h"
#include "llviewertexlayer.h"
#include "llvovolume.h"
#include "llavatarrendernotifier.h"
#include "material_codes.h" // LL_MCODE_END
extern const LLUUID ANIM_AGENT_BODY_NOISE;
extern const LLUUID ANIM_AGENT_BREATHE_ROT;
@ -220,6 +222,8 @@ public:
void rebuildAttachmentOverrides();
void updateAttachmentOverrides();
void showAttachmentOverrides(bool verbose = false) const;
void getAttachmentOverrides(joint_override_data_map_t& joint_overrides,
attach_override_data_map_t& attach_overrides) const;
void getAttachmentOverrideNames(std::set<std::string>& pos_names,
std::set<std::string>& scale_names) const;

View File

@ -1272,6 +1272,122 @@ Please consider using an attachment point close to the item's position on the bo
</text>
</panel>
</panel>
<panel
label="Overrides"
layout="topleft"
name="overrides_panel"
title="Overrides">
<view_border
bevel_style="none"
follows="top|left"
height="275"
layout="topleft"
left="3"
name="log_tab_border"
top_pad="0"
width="619" />
<text
layout="topleft"
follows="top|left"
height="15"
left="6"
name="joints_descr"
top="4"
width="300">
Joints:
</text>
<scroll_list
layout="topleft"
follows="top|left"
name="joints_list"
column_padding="0"
draw_heading="false"
draw_stripes="false"
commit_on_selection_change="true"
heading_height="23"
height="253"
left="6"
top_pad="0"
width="150"/>
<text
layout="topleft"
follows="top|left"
height="15"
left_pad="5"
name="pos_overrides_descr"
top="4"
width="300">
Position overrides for joint '[JOINT]':
</text>
<scroll_list
layout="topleft"
follows="top|left"
name="pos_overrides_list"
column_padding="0"
draw_heading="true"
draw_stripes="false"
heading_height="23"
height="100"
left_delta="0"
top_pad="0"
width="310">
<scroll_list.columns
label="*"
name="override"
relative_width="0.22" />
<scroll_list.columns
label="X"
name="axis_x"
relative_width="0.26" />
<scroll_list.columns
label="Y"
name="axis_y"
relative_width="0.26" />
<scroll_list.columns
label="Z"
name="axis_z"
relative_width="0.26" />
</scroll_list>
<text
layout="topleft"
follows="top|left"
height="15"
left_delta="0"
name="scale_overrides_descr"
top_pad="3"
width="300">
Scale overrides for joint '[JOINT]':
</text>
<scroll_list
layout="topleft"
follows="top|left"
name="scale_overrides_list"
column_padding="0"
draw_heading="true"
draw_stripes="false"
heading_height="23"
height="100"
left_delta="0"
top_pad="0"
width="310">
<scroll_list.columns
label="*"
name="override"
relative_width="0.22" />
<scroll_list.columns
label="X"
name="axis_x"
relative_width="0.26" />
<scroll_list.columns
label="Y"
name="axis_y"
relative_width="0.26" />
<scroll_list.columns
label="Z"
name="axis_z"
relative_width="0.26" />
</scroll_list>
</panel>
<panel
label="Log"
layout="topleft"