SL-379 Joint overrides tab

master
Andrey Kleshchev 2020-02-10 18:29:52 +02:00
parent 67b908cd20
commit 6a3cb73009
5 changed files with 77 additions and 37 deletions

View File

@ -407,7 +407,7 @@ void showJointScaleOverrides( const LLJoint& joint, const std::string& note, con
bool LLJoint::aboveJointPosThreshold(const LLVector3& pos) const
{
LLVector3 diff = pos - getDefaultPosition();
const F32 max_joint_pos_offset = 0.0001f; // 0.1 mm
const F32 max_joint_pos_offset = LL_JOINT_TRESHOLD_POS_OFFSET; // 0.1 mm
return diff.lengthSquared() > max_joint_pos_offset * max_joint_pos_offset;
}

View File

@ -53,6 +53,8 @@ const U32 LL_FACE_JOINT_NUM = (LL_CHARACTER_MAX_ANIMATED_JOINTS-2);
const S32 LL_CHARACTER_MAX_PRIORITY = 7;
const F32 LL_MAX_PELVIS_OFFSET = 5.f;
const F32 LL_JOINT_TRESHOLD_POS_OFFSET = 0.0001f; //0.1 mm
class LLVector3OverrideMap
{
public:

View File

@ -641,17 +641,14 @@ void LLFloaterModelPreview::onJointListSelection()
std::string label = selected->getValue().asString();
LLJointOverrideData &data = mJointOverrides[display_lod][label];
populate_list_with_map(joints_pos, data.mPosOverrides);
//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);
}
}
@ -1433,7 +1430,6 @@ void LLFloaterModelPreview::addStringToLog(const std::ostringstream& strm, bool
}
}
void LLFloaterModelPreview::clearOverridesTab()
{
LLPanel *panel = mTabContainer->getPanelByName("overrides_panel");
@ -1446,6 +1442,16 @@ void LLFloaterModelPreview::clearOverridesTab()
}
}
void LLFloaterModelPreview::resetOverridesTab()
{
clearOverridesTab();
for (U32 i = 0; i < LLModel::NUM_LODS; ++i)
{
mJointOverrides[i].clear();
}
}
void LLFloaterModelPreview::showOverridesTab()
{
S32 display_lod = mModelPreview->mPreviewLOD;
@ -1453,11 +1459,13 @@ void LLFloaterModelPreview::showOverridesTab()
{
return;
}
// Todo: Are overrides identical for all lods?
// Joints will be listed as long as they are listed in mAlternateBindMatrix
// even if they are for some reason identical to defaults.
// Todo: Are overrides always identical for all lods? They normally are, but there might be situations where they aren't.
if (mJointOverrides[display_lod].empty())
{
// populate list
// populate map
for (LLModelLoader::scene::iterator iter = mModelPreview->mScene[display_lod].begin(); iter != mModelPreview->mScene[display_lod].end(); ++iter)
{
for (LLModelLoader::model_instance_list::iterator model_iter = iter->second.begin(); model_iter != iter->second.end(); ++model_iter)
@ -1473,10 +1481,11 @@ void LLFloaterModelPreview::showOverridesTab()
const LLVector3& jointPos = skin->mAlternateBindMatrix[j].getTranslation();
LLJointOverrideData &data = mJointOverrides[display_lod][skin->mJointNames[j]];
if (data.mPosOverrides.size() > 0
&& (data.mPosOverrides.begin()->second - jointPos).inRange(-F_APPROXIMATELY_ZERO, F_APPROXIMATELY_ZERO))
&& (data.mPosOverrides.begin()->second - jointPos).lengthSquared() > (LL_JOINT_TRESHOLD_POS_OFFSET * LL_JOINT_TRESHOLD_POS_OFFSET))
{
// File contains multiple meshes with conflicting joint offsets
// preview may be incorrect, upload result might wary (depends onto mesh_id).
// preview may be incorrect, upload result might wary (depends onto
// mesh_id that hasn't been generated yet).
data.mHasConflicts = true;
}
data.mPosOverrides[model->getName()] = jointPos;
@ -1486,36 +1495,45 @@ void LLFloaterModelPreview::showOverridesTab()
}
}
}
LLPanel *panel = mTabContainer->getPanelByName("overrides_panel");
S32 index = mTabContainer->getIndexForPanel(panel);
mTabContainer->enableTabButton(index, true);
LLScrollListCtrl *joints_list = panel->getChild<LLScrollListCtrl>("joints_list");
joint_override_data_map_t::iterator joint_iter = mJointOverrides[display_lod].begin();
joint_override_data_map_t::iterator joint_end = mJointOverrides[display_lod].end();
while (joint_iter != joint_end)
if (joints_list->isEmpty())
{
const std::string& listName = joint_iter->first;
LLScrollListItem::Params item_params;
item_params.value(listName);
LLScrollListCell::Params cell_params;
cell_params.font = LLFontGL::getFontSansSerif();
cell_params.value = listName;
if (joint_iter->second.mHasConflicts)
// Populate table
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();
while (joint_iter != joint_end)
{
cell_params.color = LLColor4::orange;
const std::string& listName = joint_iter->first;
LLScrollListItem::Params item_params;
item_params.value(listName);
LLScrollListCell::Params cell_params;
cell_params.font = LLFontGL::getFontSansSerif();
cell_params.value = listName;
if (joint_iter->second.mHasConflicts)
{
cell_params.color = LLColor4::orange;
conflicts++;
}
item_params.columns.add(cell_params);
joints_list->addRow(item_params, ADD_BOTTOM);
joint_iter++;
}
joints_list->selectFirstItem();
item_params.columns.add(cell_params);
joints_list->addRow(item_params, ADD_BOTTOM);
joint_iter++;
LLTextBox *joint_pos_descr = panel->getChild<LLTextBox>("conflicts_description");
joint_pos_descr->setTextArg("[CONFLICTS]", llformat("%d", conflicts));
joint_pos_descr->setTextArg("[JOINTS_COUNT]", llformat("%d", mJointOverrides[display_lod].size()));
}
joints_list->selectFirstItem();
}
void LLFloaterModelPreview::hideOverridesTab()
@ -2451,7 +2469,7 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod)
}
else
{
fmp->clearOverridesTab();
fmp->resetOverridesTab();
fmp->hideOverridesTab();
}
@ -4051,6 +4069,8 @@ void LLModelPreview::addEmptyFace( LLModel* pTarget )
//-----------------------------------------------------------------------------
// render()
//-----------------------------------------------------------------------------
// Todo: we shouldn't be setting all those UI elements on render.
// Note: Render happens each frame with skinned avatars
BOOL LLModelPreview::render()
{
assert_main_thread();
@ -4824,6 +4844,13 @@ void LLModelPreview::setPreviewLOD(S32 lod)
mFMP->childSetColor(lod_triangles_name[i], color);
mFMP->childSetColor(lod_vertices_name[i], color);
}
LLFloaterModelPreview* fmp = (LLFloaterModelPreview*)mFMP;
if (fmp)
{
// make preview repopulate tab
fmp->clearOverridesTab();
}
}
refresh();
updateStatusMessages();
@ -4845,7 +4872,7 @@ void LLFloaterModelPreview::onReset(void* user_data)
LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) user_data;
fmp->childDisable("reset_btn");
fmp->clearLogTab();
fmp->clearOverridesTab();
fmp->resetOverridesTab();
LLModelPreview* mp = fmp->mModelPreview;
std::string filename = mp->mLODFile[LLModel::LOD_HIGH];

View File

@ -107,9 +107,10 @@ public:
static void setUploadAmount(S32 amount) { sUploadAmount = amount; }
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();
void showOverridesTab();
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 setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost);

View File

@ -1279,10 +1279,20 @@
draw_stripes="false"
commit_on_selection_change="true"
heading_height="23"
height="253"
height="238"
left="6"
top_pad="0"
width="150"/>
width="200"/>
<text
layout="topleft"
follows="top|left"
height="15"
left="6"
name="conflicts_description"
top_pad="2"
width="200">
[CONFLICTS] conflicts in [JOINTS_COUNT] joints
</text>
<text
layout="topleft"
follows="top|left"