fix for SH-1788: Assert in texture load when uploading textured mesh model
and beyond: fixed the thread-safe and highest texture resolution flaws in the mesh texture uploading flow.master
parent
a451c9e834
commit
0bb7bcc96c
|
|
@ -2252,7 +2252,7 @@ LLSD LLModel::Decomposition::asLLSD() const
|
|||
ret["Positions"] = p;
|
||||
}
|
||||
|
||||
llassert(!mBaseHull.empty());
|
||||
//llassert(!mBaseHull.empty());
|
||||
|
||||
if (!mBaseHull.empty())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1121,7 +1121,7 @@ LLModelLoader::LLModelLoader( std::string filename, S32 lod, LLModelPreview* pre
|
|||
std::deque<std::string>& jointsFromNodes )
|
||||
: mJointList( jointMap )
|
||||
, mJointsFromNode( jointsFromNodes )
|
||||
, LLThread("Model Loader"), mFilename(filename), mLod(lod), mPreview(preview), mFirstTransform(TRUE)
|
||||
, LLThread("Model Loader"), mFilename(filename), mLod(lod), mPreview(preview), mFirstTransform(TRUE), mNumOfFetchingTextures(0)
|
||||
{
|
||||
mJointMap["mPelvis"] = "mPelvis";
|
||||
mJointMap["mTorso"] = "mTorso";
|
||||
|
|
@ -2266,7 +2266,8 @@ void LLModelLoader::loadTextures()
|
|||
iter->second[i].mMaterial[j].mDiffuseMap =
|
||||
LLViewerTextureManager::getFetchedTextureFromUrl("file://" + iter->second[i].mMaterial[j].mDiffuseMapFilename, TRUE, LLViewerTexture::BOOST_PREVIEW);
|
||||
iter->second[i].mMaterial[j].mDiffuseMap->setLoadedCallback(LLModelPreview::textureLoadedCallback, 0, TRUE, FALSE, mPreview, NULL, FALSE);
|
||||
iter->second[i].mMaterial[j].mDiffuseMap->forceToSaveRawImage();
|
||||
iter->second[i].mMaterial[j].mDiffuseMap->forceToSaveRawImage(0, F32_MAX);
|
||||
mNumOfFetchingTextures++ ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -4140,6 +4141,14 @@ void LLModelPreview::updateStatusMessages()
|
|||
}
|
||||
}
|
||||
|
||||
if(upload_ok && mModelLoader)
|
||||
{
|
||||
if(!mModelLoader->areTexturesReady() && mFMP->childGetValue("upload_textures").asBoolean())
|
||||
{
|
||||
upload_ok = false ;
|
||||
}
|
||||
}
|
||||
|
||||
const BOOL confirmed_checkbox = mFMP->getChild<LLCheckBoxCtrl>("confirm_checkbox")->getValue().asBoolean();
|
||||
if ( upload_ok && !errorStateFromLoader && skinAndRigOk && !has_degenerate && confirmed_checkbox)
|
||||
{
|
||||
|
|
@ -5278,6 +5287,14 @@ void LLModelPreview::textureLoadedCallback( BOOL success, LLViewerFetchedTexture
|
|||
{
|
||||
LLModelPreview* preview = (LLModelPreview*) userdata;
|
||||
preview->refresh();
|
||||
|
||||
if(final && preview->mModelLoader)
|
||||
{
|
||||
if(preview->mModelLoader->mNumOfFetchingTextures > 0)
|
||||
{
|
||||
preview->mModelLoader->mNumOfFetchingTextures-- ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLModelPreview::onLODParamCommit(bool enforce_tri_limit)
|
||||
|
|
|
|||
|
|
@ -132,6 +132,9 @@ public:
|
|||
JointTransformMap& mJointList;
|
||||
std::deque<std::string>& mJointsFromNode;
|
||||
|
||||
S32 mNumOfFetchingTextures ; //updated in the main thread
|
||||
bool areTexturesReady() { return !mNumOfFetchingTextures; } //called in the main thread.
|
||||
|
||||
private:
|
||||
static std::list<LLModelLoader*> sActiveLoaderList;
|
||||
static bool isAlive(LLModelLoader* loader) ;
|
||||
|
|
|
|||
|
|
@ -1556,16 +1556,12 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
|
|||
std::stringstream texture_str;
|
||||
if (texture != NULL && include_textures && mUploadTextures)
|
||||
{
|
||||
// Get binary rep of texture, if needed.
|
||||
LLTextureUploadData data(texture, material.mDiffuseMapLabel);
|
||||
if (!data.mTexture->isRawImageValid())
|
||||
{
|
||||
data.mTexture->reloadRawImage(data.mTexture->getDiscardLevel());
|
||||
if(texture->hasSavedRawImage())
|
||||
{
|
||||
LLPointer<LLImageJ2C> upload_file =
|
||||
LLViewerTextureList::convertToUploadFile(texture->getSavedRawImage());
|
||||
texture_str.write((const char*) upload_file->getData(), upload_file->getDataSize());
|
||||
}
|
||||
|
||||
LLPointer<LLImageJ2C> upload_file =
|
||||
LLViewerTextureList::convertToUploadFile(data.mTexture->getRawImage());
|
||||
texture_str.write((const char*) upload_file->getData(), upload_file->getDataSize());
|
||||
}
|
||||
|
||||
if (texture != NULL &&
|
||||
|
|
@ -2868,9 +2864,12 @@ void LLMeshUploadThread::doUploadTexture(LLTextureUploadData& data)
|
|||
data.mTexture->reloadRawImage(data.mTexture->getDiscardLevel());
|
||||
}
|
||||
|
||||
LLPointer<LLImageJ2C> upload_file = LLViewerTextureList::convertToUploadFile(data.mTexture->getRawImage());
|
||||
if(data.mTexture->hasSavedRawImage())
|
||||
{
|
||||
LLPointer<LLImageJ2C> upload_file = LLViewerTextureList::convertToUploadFile(data.mTexture->getSavedRawImage());
|
||||
|
||||
ostr.write((const char*) upload_file->getData(), upload_file->getDataSize());
|
||||
ostr.write((const char*) upload_file->getData(), upload_file->getDataSize());
|
||||
}
|
||||
|
||||
data.mAssetData = ostr.str();
|
||||
|
||||
|
|
|
|||
|
|
@ -1168,6 +1168,7 @@ void LLViewerFetchedTexture::init(bool firstinit)
|
|||
mSavedRawDiscardLevel = -1 ;
|
||||
mDesiredSavedRawDiscardLevel = -1 ;
|
||||
mLastReferencedSavedRawImageTime = 0.0f ;
|
||||
mKeptSavedRawImageTime = 0.f ;
|
||||
mLastCallBackActiveTime = 0.f;
|
||||
}
|
||||
|
||||
|
|
@ -2696,8 +2697,16 @@ void LLViewerFetchedTexture::saveRawImage()
|
|||
mLastReferencedSavedRawImageTime = sCurrentTime ;
|
||||
}
|
||||
|
||||
void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard)
|
||||
void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard, F32 kept_time)
|
||||
{
|
||||
mKeptSavedRawImageTime = kept_time ;
|
||||
mLastReferencedSavedRawImageTime = sCurrentTime ;
|
||||
|
||||
if(mSavedRawDiscardLevel > -1 && mSavedRawDiscardLevel <= desired_discard)
|
||||
{
|
||||
return ; //raw imge is ready.
|
||||
}
|
||||
|
||||
if(!mForceToSaveRawImage || mDesiredSavedRawDiscardLevel < 0 || mDesiredSavedRawDiscardLevel > desired_discard)
|
||||
{
|
||||
mForceToSaveRawImage = TRUE ;
|
||||
|
|
@ -2713,11 +2722,16 @@ void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard)
|
|||
|
||||
mRawImage = NULL ;
|
||||
mRawDiscardLevel = INVALID_DISCARD_LEVEL ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
void LLViewerFetchedTexture::destroySavedRawImage()
|
||||
{
|
||||
if(mLastReferencedSavedRawImageTime < mKeptSavedRawImageTime)
|
||||
{
|
||||
return ; //keep the saved raw image.
|
||||
}
|
||||
|
||||
mForceToSaveRawImage = FALSE ;
|
||||
mSaveRawImage = FALSE ;
|
||||
|
||||
|
|
@ -2729,6 +2743,7 @@ void LLViewerFetchedTexture::destroySavedRawImage()
|
|||
mSavedRawDiscardLevel = -1 ;
|
||||
mDesiredSavedRawDiscardLevel = -1 ;
|
||||
mLastReferencedSavedRawImageTime = 0.0f ;
|
||||
mKeptSavedRawImageTime = 0.f ;
|
||||
}
|
||||
|
||||
LLImageRaw* LLViewerFetchedTexture::getSavedRawImage()
|
||||
|
|
|
|||
|
|
@ -465,7 +465,7 @@ public:
|
|||
S32 getCachedRawImageLevel() const {return mCachedRawDiscardLevel;}
|
||||
BOOL isCachedRawImageReady() const {return mCachedRawImageReady ;}
|
||||
BOOL isRawImageValid()const { return mIsRawImageValid ; }
|
||||
void forceToSaveRawImage(S32 desired_discard = 0) ;
|
||||
void forceToSaveRawImage(S32 desired_discard = 0, F32 kept_time = 0.f) ;
|
||||
/*virtual*/ void setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) ;
|
||||
void destroySavedRawImage() ;
|
||||
LLImageRaw* getSavedRawImage() ;
|
||||
|
|
@ -550,6 +550,7 @@ protected:
|
|||
S32 mSavedRawDiscardLevel;
|
||||
S32 mDesiredSavedRawDiscardLevel;
|
||||
F32 mLastReferencedSavedRawImageTime ;
|
||||
F32 mKeptSavedRawImageTime ;
|
||||
|
||||
//a small version of the copy of the raw image (<= 64 * 64)
|
||||
LLPointer<LLImageRaw> mCachedRawImage;
|
||||
|
|
|
|||
Loading…
Reference in New Issue