summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/llmaterialeditor.cpp199
-rw-r--r--indra/newview/llmaterialeditor.h8
-rw-r--r--indra/newview/llviewerassetupload.cpp22
-rw-r--r--indra/newview/llviewerassetupload.h7
4 files changed, 207 insertions, 29 deletions
diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp
index 4f8558277d..57cd74e0f2 100644
--- a/indra/newview/llmaterialeditor.cpp
+++ b/indra/newview/llmaterialeditor.cpp
@@ -40,6 +40,7 @@
#include "llviewertexture.h"
#include "llsdutil.h"
#include "llselectmgr.h"
+#include "llstatusbar.h" // can_afford_transaction()
#include "llviewerinventory.h"
#include "llviewerregion.h"
#include "llvovolume.h"
@@ -56,6 +57,11 @@
#include <strstream>
+const std::string MATERIAL_ALBEDO_DEFAULT_NAME = "Albedo";
+const std::string MATERIAL_NORMAL_DEFAULT_NAME = "Normal";
+const std::string MATERIAL_METALLIC_DEFAULT_NAME = "Metallic Roughness";
+const std::string MATERIAL_EMISSIVE_DEFAULT_NAME = "Emissive";
+
class LLMaterialEditorCopiedCallback : public LLInventoryCallback
{
public:
@@ -79,6 +85,8 @@ private:
LLMaterialEditor::LLMaterialEditor(const LLSD& key)
: LLPreview(key)
, mHasUnsavedChanges(false)
+ , mExpectedUploadCost(0)
+ , mUploadingTexturesCount(0)
{
const LLInventoryItem* item = getItem();
if (item)
@@ -366,8 +374,8 @@ void LLMaterialEditor::setHasUnsavedChanges(bool value)
upload_texture_count++;
}
- S32 upload_cost = upload_texture_count * LLAgentBenefitsMgr::current().getTextureUploadCost();
- getChild<LLUICtrl>("total_upload_fee")->setTextArg("[FEE]", llformat("%d", upload_cost));
+ mExpectedUploadCost = upload_texture_count * LLAgentBenefitsMgr::current().getTextureUploadCost();
+ getChild<LLUICtrl>("total_upload_fee")->setTextArg("[FEE]", llformat("%d", mExpectedUploadCost));
}
void LLMaterialEditor::setCanSaveAs(BOOL value)
@@ -474,6 +482,14 @@ static U32 write_texture(const LLUUID& id, tinygltf::Model& model)
void LLMaterialEditor::onClickSave()
{
+ if (!can_afford_transaction(mExpectedUploadCost))
+ {
+ LLSD args;
+ args["COST"] = llformat("%d", mExpectedUploadCost);
+ LLNotificationsUtil::add("ErrorCannotAffordUpload", args);
+ return;
+ }
+
applyToSelection();
saveIfNeeded();
}
@@ -634,9 +650,22 @@ bool LLMaterialEditor::decodeAsset(const std::vector<char>& buffer)
bool LLMaterialEditor::saveIfNeeded()
{
+ if (mUploadingTexturesCount > 0)
+ {
+ // upload already in progress
+ // wait until textures upload
+ // will retry saving on callback
+ return true;
+ }
+
+ if (saveTextures() > 0)
+ {
+ // started texture upload
+ setEnabled(false);
+ return true;
+ }
+
std::string buffer = getEncodedAsset();
-
- saveTextures();
const LLInventoryItem* item = getItem();
// save it out to database
@@ -839,6 +868,14 @@ void LLMaterialEditor::refreshFromInventory(const LLUUID& new_item_id)
void LLMaterialEditor::onClickSaveAs()
{
+ if (!can_afford_transaction(mExpectedUploadCost))
+ {
+ LLSD args;
+ args["COST"] = llformat("%d", mExpectedUploadCost);
+ LLNotificationsUtil::add("ErrorCannotAffordUpload", args);
+ return;
+ }
+
LLSD args;
args["DESC"] = mMaterialName;
@@ -1161,6 +1198,11 @@ void LLMaterialFilePicker::loadMaterial(const std::string& filename)
{
mME->mAlbedoFetched->forceToSaveRawImage(0, F32_MAX);
albedo_id = mME->mAlbedoFetched->getID();
+
+ if (mME->mAlbedoName.empty())
+ {
+ mME->mAlbedoName = MATERIAL_ALBEDO_DEFAULT_NAME;
+ }
}
LLUUID normal_id;
@@ -1168,6 +1210,11 @@ void LLMaterialFilePicker::loadMaterial(const std::string& filename)
{
mME->mNormalFetched->forceToSaveRawImage(0, F32_MAX);
normal_id = mME->mNormalFetched->getID();
+
+ if (mME->mNormalName.empty())
+ {
+ mME->mNormalName = MATERIAL_NORMAL_DEFAULT_NAME;
+ }
}
LLUUID mr_id;
@@ -1175,6 +1222,11 @@ void LLMaterialFilePicker::loadMaterial(const std::string& filename)
{
mME->mMetallicRoughnessFetched->forceToSaveRawImage(0, F32_MAX);
mr_id = mME->mMetallicRoughnessFetched->getID();
+
+ if (mME->mMetallicRoughnessName.empty())
+ {
+ mME->mMetallicRoughnessName = MATERIAL_METALLIC_DEFAULT_NAME;
+ }
}
LLUUID emissive_id;
@@ -1182,6 +1234,11 @@ void LLMaterialFilePicker::loadMaterial(const std::string& filename)
{
mME->mEmissiveFetched->forceToSaveRawImage(0, F32_MAX);
emissive_id = mME->mEmissiveFetched->getID();
+
+ if (mME->mEmissiveName.empty())
+ {
+ mME->mEmissiveName = MATERIAL_EMISSIVE_DEFAULT_NAME;
+ }
}
mME->setAlbedoId(albedo_id);
@@ -1286,18 +1343,26 @@ void LLMaterialEditor::importMaterial()
void LLMaterialEditor::applyToSelection()
{
- // Todo: associate with a specific 'selection' instead
- // of modifying something that is selected
- // This should be disabled when working from agent's
- // inventory and for initial upload
+ // Todo: fix this, this is a hack, not a proper live preview
LLViewerObject* objectp = LLSelectMgr::instance().getSelection()->getFirstObject();
- if (objectp && objectp->getVolume())
+ if (objectp && objectp->getVolume() && objectp->permModify())
{
LLGLTFMaterial* mat = new LLGLTFMaterial();
getGLTFMaterial(mat);
LLVOVolume* vobjp = (LLVOVolume*)objectp;
for (int i = 0; i < vobjp->getNumTEs(); ++i)
{
+ // this is here just to prevent material from immediately resetting
+ if (mAssetID.notNull())
+ {
+ vobjp->setRenderMaterialID(i, mAssetID);
+ }
+ else
+ {
+ const LLUUID placeholder("984e183e-7811-4b05-a502-d79c6f978a98");
+ vobjp->setRenderMaterialID(i, placeholder);
+ }
+
vobjp->getTE(i)->setGLTFMaterial(mat);
vobjp->updateTEMaterialTextures(i);
}
@@ -1508,7 +1573,7 @@ void LLMaterialEditor::inventoryChanged(LLViewerObject* object,
}
-void LLMaterialEditor::saveTexture(LLImageJ2C* img, const std::string& name, const LLUUID& asset_id)
+void LLMaterialEditor::saveTexture(LLImageJ2C* img, const std::string& name, const LLUUID& asset_id, upload_callback_f cb)
{
if (asset_id.isNull()
|| img == nullptr
@@ -1523,7 +1588,6 @@ void LLMaterialEditor::saveTexture(LLImageJ2C* img, const std::string& name, con
U32 expected_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost();
- LLAssetStorage::LLStoreAssetCallback callback;
LLResourceUploadInfo::ptr_t uploadInfo(std::make_shared<LLNewBufferedResourceUploadInfo>(
buffer,
@@ -1538,28 +1602,114 @@ void LLMaterialEditor::saveTexture(LLImageJ2C* img, const std::string& name, con
LLFloaterPerms::getGroupPerms("Uploads"),
LLFloaterPerms::getEveryonePerms("Uploads"),
expected_upload_cost,
- false));
+ false,
+ cb));
- upload_new_resource(uploadInfo, callback, nullptr);
+ upload_new_resource(uploadInfo);
}
-void LLMaterialEditor::saveTextures()
+S32 LLMaterialEditor::saveTextures()
{
- if (mAlbedoTextureUploadId == getAlbedoId())
+ S32 work_count = 0;
+ LLSD key = getKey(); // must be locally declared for lambda's capture to work
+ if (mAlbedoTextureUploadId == getAlbedoId() && mAlbedoTextureUploadId.notNull())
{
- saveTexture(mAlbedoJ2C, mAlbedoName, mAlbedoTextureUploadId);
+ mUploadingTexturesCount++;
+ work_count++;
+ saveTexture(mAlbedoJ2C, mAlbedoName, mAlbedoTextureUploadId, [key](LLUUID newAssetId, LLSD response)
+ {
+ LLMaterialEditor* me = LLFloaterReg::findTypedInstance<LLMaterialEditor>("material_editor", key);
+ if (me)
+ {
+ if (response["success"].asBoolean())
+ {
+ me->setAlbedoId(newAssetId);
+ }
+ else
+ {
+ // To make sure that we won't retry (some failures can cb immediately)
+ me->setAlbedoId(LLUUID::null);
+ }
+ me->mUploadingTexturesCount--;
+
+ // try saving
+ me->saveIfNeeded();
+ }
+ });
}
- if (mNormalTextureUploadId == getNormalId())
+ if (mNormalTextureUploadId == getNormalId() && mNormalTextureUploadId.notNull())
{
- saveTexture(mNormalJ2C, mNormalName, mNormalTextureUploadId);
+ mUploadingTexturesCount++;
+ work_count++;
+ saveTexture(mNormalJ2C, mNormalName, mNormalTextureUploadId, [key](LLUUID newAssetId, LLSD response)
+ {
+ LLMaterialEditor* me = LLFloaterReg::findTypedInstance<LLMaterialEditor>("material_editor", key);
+ if (me)
+ {
+ if (response["success"].asBoolean())
+ {
+ me->setNormalId(newAssetId);
+ }
+ else
+ {
+ me->setNormalId(LLUUID::null);
+ }
+ me->setNormalId(newAssetId);
+ me->mUploadingTexturesCount--;
+
+ // try saving
+ me->saveIfNeeded();
+ }
+ });
}
- if (mMetallicTextureUploadId == getMetallicRoughnessId())
+ if (mMetallicTextureUploadId == getMetallicRoughnessId() && mMetallicTextureUploadId.notNull())
{
- saveTexture(mMetallicRoughnessJ2C, mMetallicRoughnessName, mMetallicTextureUploadId);
+ mUploadingTexturesCount++;
+ work_count++;
+ saveTexture(mMetallicRoughnessJ2C, mMetallicRoughnessName, mMetallicTextureUploadId, [key](LLUUID newAssetId, LLSD response)
+ {
+ LLMaterialEditor* me = LLFloaterReg::findTypedInstance<LLMaterialEditor>("material_editor", key);
+ if (me)
+ {
+ if (response["success"].asBoolean())
+ {
+ me->setMetallicRoughnessId(newAssetId);
+ }
+ else
+ {
+ me->setMetallicRoughnessId(LLUUID::null);
+ }
+ me->mUploadingTexturesCount--;
+
+ // try saving
+ me->saveIfNeeded();
+ }
+ });
}
- if (mEmissiveTextureUploadId == getEmissiveId())
+
+ if (mEmissiveTextureUploadId == getEmissiveId() && mEmissiveTextureUploadId.notNull())
{
- saveTexture(mEmissiveJ2C, mEmissiveName, mEmissiveTextureUploadId);
+ mUploadingTexturesCount++;
+ work_count++;
+ saveTexture(mEmissiveJ2C, mEmissiveName, mEmissiveTextureUploadId, [key](LLUUID newAssetId, LLSD response)
+ {
+ LLMaterialEditor* me = LLFloaterReg::findTypedInstance<LLMaterialEditor>("material_editor", LLSD(key));
+ if (me)
+ {
+ if (response["success"].asBoolean())
+ {
+ me->setEmissiveId(newAssetId);
+ }
+ else
+ {
+ me->setEmissiveId(LLUUID::null);
+ }
+ me->mUploadingTexturesCount--;
+
+ // try saving
+ me->saveIfNeeded();
+ }
+ });
}
// discard upload buffers once textures have been saved
@@ -1577,5 +1727,10 @@ void LLMaterialEditor::saveTextures()
mNormalTextureUploadId.setNull();
mMetallicTextureUploadId.setNull();
mEmissiveTextureUploadId.setNull();
+
+ // asset storage can callback immediately, causing a decrease
+ // of mUploadingTexturesCount, report amount of work scheduled
+ // not amount of work remaining
+ return work_count;
}
diff --git a/indra/newview/llmaterialeditor.h b/indra/newview/llmaterialeditor.h
index 6196e3d310..3da59c7f93 100644
--- a/indra/newview/llmaterialeditor.h
+++ b/indra/newview/llmaterialeditor.h
@@ -63,10 +63,12 @@ public:
void inventoryChanged(LLViewerObject* object, LLInventoryObject::object_list_t* inventory, S32 serial_num, void* user_data) override;
- void saveTexture(LLImageJ2C* img, const std::string& name, const LLUUID& asset_id);
+ typedef std::function<void(LLUUID newAssetId, LLSD response)> upload_callback_f;
+ void saveTexture(LLImageJ2C* img, const std::string& name, const LLUUID& asset_id, upload_callback_f cb);
// save textures to inventory if needed
- void saveTextures();
+ // returns amount of scheduled uploads
+ S32 saveTextures();
void onClickSave();
@@ -191,6 +193,8 @@ private:
LLPointer<LLImageJ2C> mEmissiveJ2C;
bool mHasUnsavedChanges;
+ S32 mUploadingTexturesCount;
+ S32 mExpectedUploadCost;
std::string mMaterialName;
};
diff --git a/indra/newview/llviewerassetupload.cpp b/indra/newview/llviewerassetupload.cpp
index c4211fcb19..8e1ebdf6fa 100644
--- a/indra/newview/llviewerassetupload.cpp
+++ b/indra/newview/llviewerassetupload.cpp
@@ -510,11 +510,13 @@ LLNewBufferedResourceUploadInfo::LLNewBufferedResourceUploadInfo(
U32 groupPerms,
U32 everyonePerms,
S32 expectedCost,
- bool show_inventory) :
- LLResourceUploadInfo(name, description, compressionInfo,
+ bool show_inventory,
+ uploadFinish_f finish)
+ : LLResourceUploadInfo(name, description, compressionInfo,
destinationType, inventoryType,
- nextOWnerPerms, groupPerms, everyonePerms, expectedCost, show_inventory),
- mBuffer(buffer)
+ nextOWnerPerms, groupPerms, everyonePerms, expectedCost, show_inventory)
+ , mBuffer(buffer)
+ , mFinishFn(finish)
{
setAssetType(assetType);
setAssetId(asset_id);
@@ -543,6 +545,18 @@ LLSD LLNewBufferedResourceUploadInfo::exportTempFile()
return LLSD();
}
+LLUUID LLNewBufferedResourceUploadInfo::finishUpload(LLSD &result)
+{
+ LLUUID newItemId = LLResourceUploadInfo::finishUpload(result);
+
+ if (mFinishFn)
+ {
+ mFinishFn(result["new_asset"].asUUID(), result);
+ }
+
+ return newItemId;
+}
+
//=========================================================================
LLBufferedAssetUploadInfo::LLBufferedAssetUploadInfo(LLUUID itemId, LLAssetType::EType assetType, std::string buffer, invnUploadFinish_f finish) :
LLResourceUploadInfo(std::string(), std::string(), 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
diff --git a/indra/newview/llviewerassetupload.h b/indra/newview/llviewerassetupload.h
index 91ffa973fa..9eddcfbd0e 100644
--- a/indra/newview/llviewerassetupload.h
+++ b/indra/newview/llviewerassetupload.h
@@ -172,6 +172,8 @@ private:
class LLNewBufferedResourceUploadInfo : public LLResourceUploadInfo
{
public:
+ typedef std::function<void(LLUUID newAssetId, LLSD response)> uploadFinish_f;
+
LLNewBufferedResourceUploadInfo(
const std::string& buffer,
const LLAssetID& asset_id,
@@ -185,15 +187,18 @@ public:
U32 groupPerms,
U32 everyonePerms,
S32 expectedCost,
- bool show_inventory = true);
+ bool show_inventory,
+ uploadFinish_f finish);
virtual LLSD prepareUpload();
protected:
virtual LLSD exportTempFile();
+ virtual LLUUID finishUpload(LLSD &result);
private:
+ uploadFinish_f mFinishFn;
std::string mBuffer;
};