Merge viewer-mesh-upload
commit
49fa42b1aa
|
|
@ -139,7 +139,7 @@ LLModelLoader::LLModelLoader(
|
|||
, mStateCallback(state_cb)
|
||||
, mOpaqueData(opaque_userdata)
|
||||
, mRigValidJointUpload(true)
|
||||
, mLegacyRigValid(true)
|
||||
, mLegacyRigFlags(0)
|
||||
, mNoNormalize(false)
|
||||
, mNoOptimize(false)
|
||||
, mCacheOnlyHitIfRigged(false)
|
||||
|
|
@ -148,6 +148,7 @@ LLModelLoader::LLModelLoader(
|
|||
{
|
||||
assert_main_thread();
|
||||
sActiveLoaderList.push_back(this) ;
|
||||
mWarningsArray = LLSD::emptyArray();
|
||||
}
|
||||
|
||||
LLModelLoader::~LLModelLoader()
|
||||
|
|
@ -158,7 +159,7 @@ LLModelLoader::~LLModelLoader()
|
|||
|
||||
void LLModelLoader::run()
|
||||
{
|
||||
mWarningStream.clear();
|
||||
mWarningsArray.clear();
|
||||
doLoadModel();
|
||||
doOnIdleOneTime(boost::bind(&LLModelLoader::loadModelCallback,this));
|
||||
}
|
||||
|
|
@ -403,7 +404,7 @@ void LLModelLoader::critiqueRigForUploadApplicability( const std::vector<std::st
|
|||
//2. It is suitable for upload as standard av with just skin weights
|
||||
|
||||
bool isJointPositionUploadOK = isRigSuitableForJointPositionUpload( jointListFromAsset );
|
||||
bool isRigLegacyOK = isRigLegacy( jointListFromAsset );
|
||||
U32 legacy_rig_flags = determineRigLegacyFlags( jointListFromAsset );
|
||||
|
||||
// It's OK that both could end up being true.
|
||||
|
||||
|
|
@ -417,19 +418,16 @@ void LLModelLoader::critiqueRigForUploadApplicability( const std::vector<std::st
|
|||
setRigValidForJointPositionUpload( false );
|
||||
}
|
||||
|
||||
if ( !isRigLegacyOK)
|
||||
{
|
||||
// This starts out true, becomes false if false for any loaded
|
||||
// mesh.
|
||||
setLegacyRigValid( false );
|
||||
}
|
||||
legacy_rig_flags |= getLegacyRigFlags();
|
||||
// This starts as 0, changes if any loaded mesh has issues
|
||||
setLegacyRigFlags(legacy_rig_flags);
|
||||
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// isRigLegacy()
|
||||
// determineRigLegacyFlags()
|
||||
//-----------------------------------------------------------------------------
|
||||
bool LLModelLoader::isRigLegacy( const std::vector<std::string> &jointListFromAsset )
|
||||
U32 LLModelLoader::determineRigLegacyFlags( const std::vector<std::string> &jointListFromAsset )
|
||||
{
|
||||
//No joints in asset
|
||||
if ( jointListFromAsset.size() == 0 )
|
||||
|
|
@ -442,8 +440,12 @@ bool LLModelLoader::isRigLegacy( const std::vector<std::string> &jointListFromAs
|
|||
{
|
||||
LL_WARNS() << "Rigged to " << jointListFromAsset.size() << " joints, max is " << mMaxJointsPerMesh << LL_ENDL;
|
||||
LL_WARNS() << "Skinning disabled due to too many joints" << LL_ENDL;
|
||||
mWarningStream << "Skinning disabled due to too many joints, maximum amount per mesh: " << mMaxJointsPerMesh << "\n";
|
||||
return false;
|
||||
LLSD args;
|
||||
args["Message"] = "TooManyJoint";
|
||||
args["[JOINTS]"] = LLSD::Integer(jointListFromAsset.size());
|
||||
args["[MAX]"] = LLSD::Integer(mMaxJointsPerMesh);
|
||||
mWarningsArray.append(args);
|
||||
return LEGACY_RIG_FLAG_TOO_MANY_JOINTS;
|
||||
}
|
||||
|
||||
// Unknown joints in asset
|
||||
|
|
@ -454,18 +456,24 @@ bool LLModelLoader::isRigLegacy( const std::vector<std::string> &jointListFromAs
|
|||
if (mJointMap.find(*it)==mJointMap.end())
|
||||
{
|
||||
LL_WARNS() << "Rigged to unrecognized joint name " << *it << LL_ENDL;
|
||||
mWarningStream << "Rigged to unrecognized joint name " << *it << "\n";
|
||||
LLSD args;
|
||||
args["Message"] = "UnrecognizedJoint";
|
||||
args["[NAME]"] = *it;
|
||||
mWarningsArray.append(args);
|
||||
unknown_joint_count++;
|
||||
}
|
||||
}
|
||||
if (unknown_joint_count>0)
|
||||
{
|
||||
LL_WARNS() << "Skinning disabled due to unknown joints" << LL_ENDL;
|
||||
mWarningStream << "Skinning disabled due to unknown joints\n";
|
||||
return false;
|
||||
LLSD args;
|
||||
args["Message"] = "UnknownJoints";
|
||||
args["[COUNT]"] = LLSD::Integer(unknown_joint_count);
|
||||
mWarningsArray.append(args);
|
||||
return LEGACY_RIG_FLAG_UNKNOWN_JOINT;
|
||||
}
|
||||
|
||||
return true;
|
||||
return LEGACY_RIG_OK;
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
// isRigSuitableForJointPositionUpload()
|
||||
|
|
|
|||
|
|
@ -42,6 +42,10 @@ typedef std::deque<std::string> JointNameSet;
|
|||
const S32 SLM_SUPPORTED_VERSION = 3;
|
||||
const S32 NUM_LOD = 4;
|
||||
|
||||
const U32 LEGACY_RIG_OK = 0;
|
||||
const U32 LEGACY_RIG_FLAG_TOO_MANY_JOINTS = 1;
|
||||
const U32 LEGACY_RIG_FLAG_UNKNOWN_JOINT = 2;
|
||||
|
||||
class LLModelLoader : public LLThread
|
||||
{
|
||||
public:
|
||||
|
|
@ -166,7 +170,7 @@ public:
|
|||
void critiqueRigForUploadApplicability( const std::vector<std::string> &jointListFromAsset );
|
||||
|
||||
//Determines if a rig is a legacy from the joint list
|
||||
bool isRigLegacy( const std::vector<std::string> &jointListFromAsset );
|
||||
U32 determineRigLegacyFlags( const std::vector<std::string> &jointListFromAsset );
|
||||
|
||||
//Determines if a rig is suitable for upload
|
||||
bool isRigSuitableForJointPositionUpload( const std::vector<std::string> &jointListFromAsset );
|
||||
|
|
@ -174,8 +178,9 @@ public:
|
|||
const bool isRigValidForJointPositionUpload( void ) const { return mRigValidJointUpload; }
|
||||
void setRigValidForJointPositionUpload( bool rigValid ) { mRigValidJointUpload = rigValid; }
|
||||
|
||||
const bool isLegacyRigValid( void ) const { return mLegacyRigValid; }
|
||||
void setLegacyRigValid( bool rigValid ) { mLegacyRigValid = rigValid; }
|
||||
const bool isLegacyRigValid(void) const { return mLegacyRigFlags == 0; }
|
||||
U32 getLegacyRigFlags() const { return mLegacyRigFlags; }
|
||||
void setLegacyRigFlags( U32 rigFlags ) { mLegacyRigFlags = rigFlags; }
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// isNodeAJoint()
|
||||
|
|
@ -185,8 +190,8 @@ public:
|
|||
return name != NULL && mJointMap.find(name) != mJointMap.end();
|
||||
}
|
||||
|
||||
std::string logOut() { return mWarningStream.str(); }
|
||||
void clearLog() { mWarningStream.clear(); }
|
||||
const LLSD logOut() const { return mWarningsArray; }
|
||||
void clearLog() { mWarningsArray.clear(); }
|
||||
|
||||
protected:
|
||||
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
|
||||
|
|
@ -208,14 +213,14 @@ protected:
|
|||
void* mOpaqueData;
|
||||
|
||||
bool mRigValidJointUpload;
|
||||
bool mLegacyRigValid;
|
||||
U32 mLegacyRigFlags;
|
||||
|
||||
bool mNoNormalize;
|
||||
bool mNoOptimize;
|
||||
|
||||
JointTransformMap mJointTransformMap;
|
||||
|
||||
std::ostringstream mWarningStream; // preview floater will pull logs from here
|
||||
LLSD mWarningsArray; // preview floater will pull logs from here
|
||||
|
||||
static std::list<LLModelLoader*> sActiveLoaderList;
|
||||
static bool isAlive(LLModelLoader* loader) ;
|
||||
|
|
|
|||
|
|
@ -350,6 +350,9 @@ BOOL LLFloaterModelPreview::postBuild()
|
|||
childDisable("upload_joints");
|
||||
childDisable("lock_scale_if_joint_position");
|
||||
|
||||
childSetVisible("skin_too_many_joints", false);
|
||||
childSetVisible("skin_unknown_joint", false);
|
||||
|
||||
initDecompControls();
|
||||
|
||||
LLView* preview_panel = getChild<LLView>("preview_panel");
|
||||
|
|
@ -608,6 +611,8 @@ void LLFloaterModelPreview::loadModel(S32 lod, const std::string& file_name, boo
|
|||
|
||||
void LLFloaterModelPreview::onClickCalculateBtn()
|
||||
{
|
||||
clearLogTab();
|
||||
|
||||
mModelPreview->rebuildUploadData();
|
||||
|
||||
bool upload_skinweights = childGetValue("upload_skin").asBoolean();
|
||||
|
|
@ -1408,6 +1413,34 @@ void LLFloaterModelPreview::onMouseCaptureLostModelPreview(LLMouseHandler* handl
|
|||
//-----------------------------------------------------------------------------
|
||||
// addStringToLog()
|
||||
//-----------------------------------------------------------------------------
|
||||
//static
|
||||
void LLFloaterModelPreview::addStringToLog(const std::string& message, const LLSD& args, bool flash, S32 lod)
|
||||
{
|
||||
if (sInstance && sInstance->hasString(message))
|
||||
{
|
||||
std::string str;
|
||||
switch (lod)
|
||||
{
|
||||
case LLModel::LOD_IMPOSTOR: str = "LOD0 "; break;
|
||||
case LLModel::LOD_LOW: str = "LOD1 "; break;
|
||||
case LLModel::LOD_MEDIUM: str = "LOD2 "; break;
|
||||
case LLModel::LOD_PHYSICS: str = "PHYS "; break;
|
||||
case LLModel::LOD_HIGH: str = "LOD3 "; break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
LLStringUtil::format_map_t args_msg;
|
||||
LLSD::map_const_iterator iter = args.beginMap();
|
||||
LLSD::map_const_iterator end = args.endMap();
|
||||
for (; iter != end; ++iter)
|
||||
{
|
||||
args_msg[iter->first] = iter->second.asString();
|
||||
}
|
||||
str += sInstance->getString(message, args_msg);
|
||||
sInstance->addStringToLogTab(str, flash);
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLFloaterModelPreview::addStringToLog(const std::string& str, bool flash)
|
||||
{
|
||||
|
|
@ -1472,7 +1505,7 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
|
|||
, mLodsQuery()
|
||||
, mLodsWithParsingError()
|
||||
, mPelvisZOffset( 0.0f )
|
||||
, mLegacyRigValid( false )
|
||||
, mLegacyRigFlags( U32_MAX )
|
||||
, mRigValidJointUpload( false )
|
||||
, mPhysicsSearchLOD( LLModel::LOD_PHYSICS )
|
||||
, mResetJoints( false )
|
||||
|
|
@ -2277,7 +2310,7 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod)
|
|||
// Copy determinations about rig so UI will reflect them
|
||||
//
|
||||
setRigValidForJointPositionUpload(mModelLoader->isRigValidForJointPositionUpload());
|
||||
setLegacyRigValid(mModelLoader->isLegacyRigValid());
|
||||
setLegacyRigFlags(mModelLoader->getLegacyRigFlags());
|
||||
|
||||
mModelLoader->loadTextures() ;
|
||||
|
||||
|
|
@ -2496,7 +2529,6 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod)
|
|||
mLoading = false;
|
||||
if (mFMP)
|
||||
{
|
||||
mFMP->getChild<LLCheckBoxCtrl>("confirm_checkbox")->set(FALSE);
|
||||
if (!mBaseModel.empty())
|
||||
{
|
||||
const std::string& model_name = mBaseModel[0]->getName();
|
||||
|
|
@ -4049,9 +4081,18 @@ void LLModelPreview::loadedCallback(
|
|||
LLModelPreview* pPreview = static_cast< LLModelPreview* >(opaque);
|
||||
if (pPreview && !LLModelPreview::sIgnoreLoadedCallback)
|
||||
{
|
||||
LLFloaterModelPreview::addStringToLog(pPreview->mModelLoader->logOut(), true);
|
||||
pPreview->mModelLoader->clearLog();
|
||||
pPreview->loadModelCallback(lod); // removes mModelLoader in some cases
|
||||
const LLSD out = pPreview->mModelLoader->logOut();
|
||||
LLSD::array_const_iterator iter_out = out.beginArray();
|
||||
LLSD::array_const_iterator end_out = out.endArray();
|
||||
for (; iter_out != end_out; ++iter_out)
|
||||
{
|
||||
if (iter_out->has("Message"))
|
||||
{
|
||||
LLFloaterModelPreview::addStringToLog(iter_out->get("Message"), *iter_out, true, pPreview->mModelLoader->mLod);
|
||||
}
|
||||
}
|
||||
pPreview->mModelLoader->clearLog();
|
||||
pPreview->loadModelCallback(lod); // removes mModelLoader in some cases
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -4243,13 +4284,25 @@ BOOL LLModelPreview::render()
|
|||
|
||||
if (has_skin_weights && lodsReady())
|
||||
{ //model has skin weights, enable view options for skin weights and joint positions
|
||||
if (fmp && isLegacyRigValid() )
|
||||
{
|
||||
fmp->enableViewOption("show_skin_weight");
|
||||
fmp->setViewOptionEnabled("show_joint_positions", skin_weight);
|
||||
mFMP->childEnable("upload_skin");
|
||||
mFMP->childSetValue("show_skin_weight", skin_weight);
|
||||
}
|
||||
U32 flags = getLegacyRigFlags();
|
||||
if (fmp)
|
||||
{
|
||||
if (flags == LEGACY_RIG_OK)
|
||||
{
|
||||
fmp->enableViewOption("show_skin_weight");
|
||||
fmp->setViewOptionEnabled("show_joint_positions", skin_weight);
|
||||
mFMP->childEnable("upload_skin");
|
||||
mFMP->childSetValue("show_skin_weight", skin_weight);
|
||||
}
|
||||
else if ((flags & LEGACY_RIG_FLAG_TOO_MANY_JOINTS) > 0)
|
||||
{
|
||||
mFMP->childSetVisible("skin_too_many_joints", true);
|
||||
}
|
||||
else if ((flags & LEGACY_RIG_FLAG_UNKNOWN_JOINT) > 0)
|
||||
{
|
||||
mFMP->childSetVisible("skin_unknown_joint", true);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -4867,14 +4920,6 @@ void LLModelPreview::setPreviewLOD(S32 lod)
|
|||
combo_box->setCurrentByIndex((NUM_LOD-1)-mPreviewLOD); // combo box list of lods is in reverse order
|
||||
mFMP->childSetValue("lod_file_" + lod_name[mPreviewLOD], mLODFile[mPreviewLOD]);
|
||||
|
||||
// <FS:Ansariel> Doesn't exist as of 16-06-2017
|
||||
//LLComboBox* combo_box2 = mFMP->getChild<LLComboBox>("preview_lod_combo2");
|
||||
//combo_box2->setCurrentByIndex((NUM_LOD-1)-mPreviewLOD); // combo box list of lods is in reverse order
|
||||
//
|
||||
//LLComboBox* combo_box3 = mFMP->getChild<LLComboBox>("preview_lod_combo3");
|
||||
//combo_box3->setCurrentByIndex((NUM_LOD-1)-mPreviewLOD); // combo box list of lods is in reverse order
|
||||
// </FS:Ansariel>
|
||||
|
||||
LLColor4 highlight_color = LLUIColorTable::instance().getColor("MeshImportTableHighlightColor");
|
||||
LLColor4 normal_color = LLUIColorTable::instance().getColor("MeshImportTableNormalColor");
|
||||
|
||||
|
|
@ -4904,8 +4949,10 @@ void LLFloaterModelPreview::onReset(void* user_data)
|
|||
{
|
||||
assert_main_thread();
|
||||
|
||||
|
||||
LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) user_data;
|
||||
fmp->childDisable("reset_btn");
|
||||
fmp->clearLogTab();
|
||||
LLModelPreview* mp = fmp->mModelPreview;
|
||||
std::string filename = mp->mLODFile[LLModel::LOD_HIGH];
|
||||
|
||||
|
|
@ -4924,6 +4971,7 @@ void LLFloaterModelPreview::onUpload(void* user_data)
|
|||
assert_main_thread();
|
||||
|
||||
LLFloaterModelPreview* mp = (LLFloaterModelPreview*) user_data;
|
||||
mp->clearLogTab();
|
||||
|
||||
mp->mUploadBtn->setEnabled(false);
|
||||
|
||||
|
|
@ -5125,6 +5173,13 @@ void LLFloaterModelPreview::resetUploadOptions()
|
|||
getChild<LLComboBox>("Cosine%")->setCurrentByIndex(0);
|
||||
}
|
||||
|
||||
void LLFloaterModelPreview::clearLogTab()
|
||||
{
|
||||
mUploadLogText->clear();
|
||||
LLPanel* panel = mTabContainer->getPanelByName("logs_panel");
|
||||
mTabContainer->setTabPanelFlashing(panel, false);
|
||||
}
|
||||
|
||||
void LLFloaterModelPreview::onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url)
|
||||
{
|
||||
mModelPhysicsFee = result;
|
||||
|
|
|
|||
|
|
@ -94,7 +94,8 @@ public:
|
|||
/*virtual*/ void onClose(bool app_quitting);
|
||||
|
||||
static void onMouseCaptureLostModelPreview(LLMouseHandler*);
|
||||
static void setUploadAmount(S32 amount) { sUploadAmount = amount; }
|
||||
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);
|
||||
|
||||
|
|
@ -225,6 +226,7 @@ private:
|
|||
void resetDisplayOptions();
|
||||
|
||||
void resetUploadOptions();
|
||||
void clearLogTab();
|
||||
|
||||
void createSmoothComboBox(LLComboBox* combo_box, float min, float max);
|
||||
|
||||
|
|
@ -310,8 +312,9 @@ public:
|
|||
void setRigValidForJointPositionUpload( bool rigValid ) { mRigValidJointUpload = rigValid; }
|
||||
|
||||
//Accessors for the legacy rigs
|
||||
const bool isLegacyRigValid( void ) const { return mLegacyRigValid; }
|
||||
void setLegacyRigValid( bool rigValid ) { mLegacyRigValid = rigValid; }
|
||||
const bool isLegacyRigValid( void ) const { return mLegacyRigFlags == 0; }
|
||||
U32 getLegacyRigFlags() const { return mLegacyRigFlags; }
|
||||
void setLegacyRigFlags( U32 rigFlags ) { mLegacyRigFlags = rigFlags; }
|
||||
|
||||
static void textureLoadedCallback( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );
|
||||
static bool lodQueryCallback();
|
||||
|
|
@ -426,7 +429,7 @@ private:
|
|||
float mPelvisZOffset;
|
||||
|
||||
bool mRigValidJointUpload;
|
||||
bool mLegacyRigValid;
|
||||
U32 mLegacyRigFlags;
|
||||
|
||||
bool mLastJointUpdate;
|
||||
|
||||
|
|
|
|||
|
|
@ -43,6 +43,12 @@
|
|||
<string name="decomposing">Analyzing...</string>
|
||||
<string name="simplifying">Simplifying...</string>
|
||||
<string name="tbd">TBD</string>
|
||||
|
||||
<!-- Warnings from model loader-->
|
||||
<string name="TooManyJoint">Skinning disabled due to too many joints: [JOINTS], maximum: [MAX]</string>
|
||||
<string name="UnrecognizedJoint">Rigged to unrecognized joint name [NAME]</string>
|
||||
<string name="UnknownJoints">Skinning disabled due to [COUNT] unknown joints</string>
|
||||
|
||||
|
||||
<panel
|
||||
follows="top|left"
|
||||
|
|
@ -1187,27 +1193,48 @@
|
|||
label="Include skin weight"
|
||||
name="upload_skin"
|
||||
top_pad="15"/>
|
||||
<text
|
||||
follows="top|left"
|
||||
height="17"
|
||||
left="40"
|
||||
name="skin_too_many_joints"
|
||||
text_color="Orange"
|
||||
top_pad="-2"
|
||||
width="300">
|
||||
Too many skinned joints
|
||||
</text>
|
||||
<text
|
||||
follows="top|left"
|
||||
height="17"
|
||||
left="40"
|
||||
name="skin_unknown_joint"
|
||||
text_color="Orange"
|
||||
top_pad="-17"
|
||||
width="300">
|
||||
Model has an unknown joint(s)
|
||||
</text>
|
||||
<check_box
|
||||
follows="top|left"
|
||||
height="15"
|
||||
label="Include joint positions"
|
||||
name="upload_joints"
|
||||
top_pad="15"/>
|
||||
left_delta="-20"
|
||||
top_pad="1"/>
|
||||
<check_box
|
||||
follows="top|left"
|
||||
height="15"
|
||||
label="Lock scale if joint position defined"
|
||||
name="lock_scale_if_joint_position"
|
||||
top_pad="15"/>
|
||||
top_pad="16"/>
|
||||
<text
|
||||
follows="top|left"
|
||||
height="15"
|
||||
layout="topleft"
|
||||
left="220"
|
||||
left="20"
|
||||
name="pelvis_offset_label"
|
||||
text_color="White"
|
||||
top="134"
|
||||
width="250">
|
||||
top_pad="16"
|
||||
width="175">
|
||||
Z offset (raise or lower avatar):
|
||||
</text>
|
||||
<spinner
|
||||
|
|
@ -1216,7 +1243,8 @@
|
|||
min_val="-3.00"
|
||||
max_val="3.0"
|
||||
name="pelvis_offset"
|
||||
top_pad="10"
|
||||
top_delta="-3"
|
||||
left_pad="5"
|
||||
value="0.0"
|
||||
width="80"/>
|
||||
<panel
|
||||
|
|
@ -1654,7 +1682,6 @@ Analysed:
|
|||
</panel>
|
||||
<panel
|
||||
follows="top|left|bottom|right"
|
||||
can_resize="true"
|
||||
name="right_panel"
|
||||
top="0"
|
||||
left="640"
|
||||
|
|
|
|||
Loading…
Reference in New Issue