summaryrefslogtreecommitdiff
path: root/indra/newview/lllocalgltfmaterials.cpp
diff options
context:
space:
mode:
authorAndrey Kleshchev <andreykproductengine@lindenlab.com>2022-10-11 00:37:08 +0300
committerAndrey Kleshchev <andreykproductengine@lindenlab.com>2022-10-11 00:37:24 +0300
commit15ac2f67634c324b8d76df51b41226272c1ef693 (patch)
tree38a676f49266a37fc61af63894d2a971c70d45c9 /indra/newview/lllocalgltfmaterials.cpp
parent5890f423b4ae0f372d72af413b2296e5291bfa67 (diff)
SL-17653 Local materials should reuse existing pointer when present instead of creating a new one.
Diffstat (limited to 'indra/newview/lllocalgltfmaterials.cpp')
-rw-r--r--indra/newview/lllocalgltfmaterials.cpp140
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)