diff options
| author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2022-10-11 00:37:08 +0300 | 
|---|---|---|
| committer | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2022-10-11 00:37:24 +0300 | 
| commit | 15ac2f67634c324b8d76df51b41226272c1ef693 (patch) | |
| tree | 38a676f49266a37fc61af63894d2a971c70d45c9 | |
| parent | 5890f423b4ae0f372d72af413b2296e5291bfa67 (diff) | |
SL-17653 Local materials should reuse existing pointer when present instead of creating a new one.
| -rw-r--r-- | indra/newview/lllocalgltfmaterials.cpp | 140 | 
1 files changed, 75 insertions, 65 deletions
| diff --git a/indra/newview/lllocalgltfmaterials.cpp b/indra/newview/lllocalgltfmaterials.cpp index 02331e9cd7..1f16549a47 100644 --- a/indra/newview/lllocalgltfmaterials.cpp +++ b/indra/newview/lllocalgltfmaterials.cpp @@ -134,83 +134,93 @@ bool LLLocalGLTFMaterial::getValid()  /* update functions */  bool LLLocalGLTFMaterial::updateSelf()  { -	bool updated = false; -	 -	if (mLinkStatus == LS_ON) -	{ -		// verifying that the file exists -		if (gDirUtilp->fileExists(mFilename)) -		{ -			// verifying that the file has indeed been modified +    bool updated = false; + +    if (mLinkStatus == LS_ON) +    { +        // verifying that the file exists +        if (gDirUtilp->fileExists(mFilename)) +        { +            // verifying that the file has indeed been modified  #ifndef LL_WINDOWS -			const std::time_t temp_time = boost::filesystem::last_write_time(boost::filesystem::path(mFilename)); +            const std::time_t temp_time = boost::filesystem::last_write_time(boost::filesystem::path(mFilename));  #else -			const std::time_t temp_time = boost::filesystem::last_write_time(boost::filesystem::path(utf8str_to_utf16str(mFilename))); +            const std::time_t temp_time = boost::filesystem::last_write_time(boost::filesystem::path(utf8str_to_utf16str(mFilename)));  #endif -			LLSD new_last_modified = asctime(localtime(&temp_time)); - -			if (mLastModified.asString() != new_last_modified.asString()) -			{ -				LLPointer<LLGLTFMaterial> raw_material = new LLGLTFMaterial(); -				if (loadMaterial(raw_material, mMaterialIndex)) -				{ -					// decode is successful, we can safely proceed. +            LLSD new_last_modified = asctime(localtime(&temp_time)); + +            if (mLastModified.asString() != new_last_modified.asString()) +            { +                LLPointer<LLGLTFMaterial> raw_material; +                if (mWorldID.notNull()) +                { +                    // update existing material +                    // will create a new one if material doesn't exist yet +                    raw_material = gGLTFMaterialList.getMaterial(mWorldID); +                } +                else +                { +                    raw_material = new LLGLTFMaterial(); +                } +                if (loadMaterial(raw_material, mMaterialIndex)) +                { +                    // decode is successful, we can safely proceed.                      if (mWorldID.isNull())                      {                          mWorldID.generate();                      } -					mLastModified = new_last_modified; +                    mLastModified = new_last_modified;                      // will replace material if it already exists                      gGLTFMaterialList.addMaterial(mWorldID, raw_material); -					mUpdateRetries = LL_LOCAL_UPDATE_RETRIES; -					updated = true; -				} - -				// if decoding failed, we get here and it will attempt to decode it in the next cycles -				// until mUpdateRetries runs out. this is done because some software lock the material while writing to it -				else -				{ -					if (mUpdateRetries) -					{ -						mUpdateRetries--; -					} -					else -					{ -						LL_WARNS() << "During the update process the following file was found" << "\n" -							    << "but could not be opened or decoded for " << LL_LOCAL_UPDATE_RETRIES << " attempts." << "\n" -								<< "Filename: " << mFilename << "\n" -								<< "Disabling further update attempts for this file." << LL_ENDL; - -						LLSD notif_args; -						notif_args["FNAME"] = mFilename; -						notif_args["NRETRIES"] = LL_LOCAL_UPDATE_RETRIES; -						LLNotificationsUtil::add("LocalBitmapsUpdateFailedFinal", notif_args); - -						mLinkStatus = LS_BROKEN; -					} -				}		 -			} -			 -		} // end if file exists - -		else -		{ -			LL_WARNS() << "During the update process, the following file was not found." << "\n"  -			        << "Filename: " << mFilename << "\n" -				    << "Disabling further update attempts for this file." << LL_ENDL; - -			LLSD notif_args; -			notif_args["FNAME"] = mFilename; -			LLNotificationsUtil::add("LocalBitmapsUpdateFileNotFound", notif_args); - -			mLinkStatus = LS_BROKEN; -		} -	} - -	return updated; +                    mUpdateRetries = LL_LOCAL_UPDATE_RETRIES; +                    updated = true; +                } + +                // if decoding failed, we get here and it will attempt to decode it in the next cycles +                // until mUpdateRetries runs out. this is done because some software lock the material while writing to it +                else +                { +                    if (mUpdateRetries) +                    { +                        mUpdateRetries--; +                    } +                    else +                    { +                        LL_WARNS() << "During the update process the following file was found" << "\n" +                            << "but could not be opened or decoded for " << LL_LOCAL_UPDATE_RETRIES << " attempts." << "\n" +                            << "Filename: " << mFilename << "\n" +                            << "Disabling further update attempts for this file." << LL_ENDL; + +                        LLSD notif_args; +                        notif_args["FNAME"] = mFilename; +                        notif_args["NRETRIES"] = LL_LOCAL_UPDATE_RETRIES; +                        LLNotificationsUtil::add("LocalBitmapsUpdateFailedFinal", notif_args); + +                        mLinkStatus = LS_BROKEN; +                    } +                } +            } + +        } // end if file exists + +        else +        { +            LL_WARNS() << "During the update process, the following file was not found." << "\n" +                << "Filename: " << mFilename << "\n" +                << "Disabling further update attempts for this file." << LL_ENDL; + +            LLSD notif_args; +            notif_args["FNAME"] = mFilename; +            LLNotificationsUtil::add("LocalBitmapsUpdateFileNotFound", notif_args); + +            mLinkStatus = LS_BROKEN; +        } +    } + +    return updated;  }  bool LLLocalGLTFMaterial::loadMaterial(LLPointer<LLGLTFMaterial> mat, S32 index) | 
